---
title:
output:
  revealjs::revealjs_presentation:
    theme: white
    css: white-edits.css
    highlight: tango
    transition: slide
    self_contained: false
    reveal_plugins: ["chalkboard","search"]
    transitionSpead: fast
    mathjax: "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-AMS_SVG"
    reveal_options:
      width: 1024
      height: 768
      minScale: 1.0
      maxScale: 1.0
      slideNumber: true
      controlsTutorial: true
      chalkboard:
        theme: whiteboard
        readOnly: false
---

## ACCT 420: Linear Regression {data-background="../Backgrounds/title.jpg" class="header no-toc-progress" data-state="no-toc-progress"}

<!-- "reveal_plugins:..." and "chalkboard:" are handled by prep.py -->

<h3 class="date"><br>Session 2</h3>
<h2 class="author"><br>Dr. Richard M. Crowley</h2>

<!-- Load in primary data set -->
```{r, include=FALSE}
library(tidyverse)
df <- read.csv("../../Data/Session_2-1.csv", stringsAsFactors=FALSE)
df_full <- df
uol <- filter(df, isin == "SG1S83002349")
#clean_df <- subset(df,fyear==2017 & !is.na(revt) & !is.na(ni) & revt > 1)
```

# Front matter {data-background="../Backgrounds/section.jpg" class="header"}

## Learning objectives {data-background="../Backgrounds/default.jpg" class="default"}

<div class="clearfix">
<div class="left">
<img src="../Course_Diagrams/Map-2.png">
</div>
<div class="right objectives">
- <b>Theory:</b>
    - Develop a logical approach to problem solving with data
        - Statistics
        - Causation
        - Hypothesis testing
- <b>Application:</b>
    - Predicting revenue for real estate firms
- <b>Methodology:</b>
    - Univariate stats
    - Linear regression
    - Visualization
</div>
<div class="clearfix">

## Datacamp {data-background="../Backgrounds/default.jpg" class="default"}

> - For next week: 
>     - Just 2 chapters:
>         - 1 on linear regression
>         - 1 on tidyverse methods
> - The full list of Datacamp materials for the course is up on eLearn

## R Installation {data-background="../Backgrounds/coding.jpg" class="default"}

- If you haven't already, make sure to install R and R Studio!
    - Instructions are in Session 1's slides
    - You will need it for this week's assignment 
- Please install a few packages using the following code
    - These packages are also needed for the first assignment
    - You are welcome to explore other packages as well, but those will not be necessary for now

```{r, eval=F}
# Run this in the R Console inside RStudio
install.packages(c("tidyverse","plotly","tufte"))
```

- Assignments will be provided as R Markdown files

> The format will generally all be filled out -- you will just add to it, answer questions, analyze data, and explain your work.  Instructions and hints are in the same file

## Assignments for this course {data-background="../Backgrounds/reference.jpg" class="default exclude"}

- Assignments will be posted online after the following lectures:

1. Session 2, on forecasting analytics
2. Session 4, on a mix of linear and logit models
3. Session 6, on forensic analytics
4. Session 8, on other methods

> For each assignment, you will have until 2 classes from release to complete it (2 weeks)

- If you are having trouble with the assignment, you can always book office hours.

## R Markdown: A quick guide {data-background="../Backgrounds/reference.jpg" class="default"}

- Headers and subheaders start with `#` and `##`, respectively
- Code blocks starts with ```` ```{r} ```` and end with ```` ``` ````
    - By default, all code and figures will show up in the document
- Inline code goes in a block starting with `` `r `` and ending with `` ` ``
- Italic font can be used by putting `*` or `_` around text
- Bold font can be used by putting `**` around text
    - E.g.: `**bold text**` becomes **bold text**
- To render the document, click <img src="../Figures/knit.png" style="margin:0px">
- Math can be placed between `$` to use LaTeX notation
    - E.g. `$\frac{revt}{at}$` becomes $\frac{revt}{at}$
- Full equations (on their own line) can be placed between `$$`
- A block quote is prefixed with `>`
- For a complete guide, see R Studio's <a href="http://www.rstudio.com/wp-content/uploads/2016/03/rmarkdown-cheatsheet-2.0.pdf">R Markdown::Cheat Sheet</a>


# Application: Revenue prediction {data-background="../Backgrounds/section.jpg" class="header"}

## The question {data-background="../Backgrounds/default.jpg" class="default"}

> How can we predict revenue for a company, leveraging data about that company, related companies, and macro factors

<div class="fragment">

- Specific application: Real estate companies

<img class="exclude" src="../Figures/CRA.jpg" height="400px">

</div>

## More specifically... {data-background="../Backgrounds/default.jpg" class="default"}

- Can we use a company's own accounting data to predict it's future revenue?
- Can we use other companies' accounting data to better predict all of their future revenue?
- Can we augment this data with macro economic data to further improve prediction?
    - Singapore business sentiment data

# Linear models {data-background="../Backgrounds/section.jpg" class="header"}

## What is a linear model? {data-background="../Backgrounds/default.jpg" class="default"}

$$
\hat{y}=\alpha + \beta \hat{x} + \varepsilon
$$

- The simplest model is trying to predict some outcome $\hat{y}$ as a function of an input $\hat{x}$
    - $\hat{y}$ in our case is a firm's revenue in a given year
    - $\hat{x}$ could be a firm's assets in a given year
    - $\alpha$ and $\beta$ are solved for
    - $\varepsilon$ is the error in the measurement

> I will refer to this as an *OLS* model -- **O**rdinary **L**east **S**quare regression

## Example {data-background="../Backgrounds/case.jpg" class="default"}

> Let's predict UOL's revenue for 2016

<div class="clearfix">
<div class="left">
<ul class="gallery gallerysmall" data-interval="1.5" data-iterations="0">
<li><img src="../Figures/UOL1.jpg" alt="Velocity"></li>
<li><img src="../Figures/UOL2.jpg" alt="Novena Square"></li>
<li><img src="../Figures/UOL3.jpg" alt="Odean Tower"></li>
<li><img src="../Figures/UOL4.jpg" alt="The Clement Canopy"></li>
<li><img src="../Figures/UOL5.jpg" alt="Pan Pacific"></li>
<li><img src="../Figures/UOL6.jpg" alt="Park Royal"></li>
<li><img src="../Figures/UOL7.jpg" alt="Si Chuan Dou Hua"></li>
</ul>
</div>
<div class="right">
- Compustat has data for them since 1989
    - Complete since 1994
        - Missing CapEx before that
```{r}
# revt: Revenue, at: Assets
summary(uol[,c("revt", "at")])
```
</div>
</div>

## Linear models in R {data-background="../Backgrounds/reference.jpg" class="default"}

- To run a linear model, use `lm()`
    - The first argument is a formula for your model, where `~` is used in place of an equals sign
        - The left side is what you want to predict
        - The right side is inputs for prediction, separated by `+`
    - The second argument is the data to use
- Additional variations for the formula:
    - Functions transforming inputs (as vectors), such as `log()`
    - Fully interacting variables using `*`
        - I.e., `A*B` includes, A, B, and A times B in the model
    - Interactions using `:`
        - I.e., `A:B` just includes A times B in the model

```{r, eval=F}
# Example:
lm(revt ~ at, data = uol)
```


## Example: UOL {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
mod1 <- lm(revt ~ at, data = uol)
summary(mod1)
```

<div class="fragment exclude">

> \$1 more in assets leads to $0.12 more revenue

</div>

## Why is it called Ordinary Least *Squares*? {data-background="../Backgrounds/default.jpg" class="default"}

```{r, echo=F, message=F, warning=F, fig.width=8, fig.height=1.5}
# Graph showing squared error
uolg <- uol[,c("at","revt")]
uolg$resid <- mod1$residuals
uolg$xleft <- ifelse(uolg$resid < 0,uolg$at,uolg$at - uolg$resid)
uolg$xright <- ifelse(uolg$resid < 0,uolg$at - uolg$resid, uol$at)
uolg$ytop <- ifelse(uolg$resid < 0,uolg$revt - uolg$resid,uol$revt)
uolg$ybottom <- ifelse(uolg$resid < 0,uolg$revt, uolg$revt - uolg$resid)
uolg$point <- TRUE

uolg2 <- uolg
uolg2$point <- FALSE
uolg2$at <- ifelse(uolg$resid < 0,uolg2$xright,uolg2$xleft)
uolg2$revt <- ifelse(uolg$resid < 0,uolg2$ytop,uolg2$ybottom)

uolg <- rbind(uolg, uolg2)


uolg %>% ggplot(aes(y=revt, x=at)) + 
         geom_point(aes(shape=point, group=point)) + 
         scale_shape_manual(values=c(NA,18)) + 
         geom_smooth(method="lm", se=FALSE) +
         geom_errorbarh(aes(xmax=xright, xmin = xleft)) + 
         geom_errorbar(aes(ymax=ytop, ymin = ybottom)) + 
         theme(legend.position="none") + xlim(0, 20000) + ylim(0, 2500)
```

## Example: UOL {data-background="../Backgrounds/case.jpg" class="default"}

- This model wasn't so interesting...
    - Bigger firms have more revenue -- this is a given
- How about... revenue *growth*?
- And *change* in assets
    - i.e., Asset growth

$$
\Delta x_t = \frac{x_t}{x_{t-1}} - 1
$$

## Calculating changes in R {data-background="../Backgrounds/reference.jpg" class="default"}

- The easiest way is using `package:tidyverse`'s `package:dplyr`
    - This has a `lag()` function
- The default way to do it is to create a vector manually

```{r, message=F}
# tidyverse
uol <- uol %>%
  mutate(revt_growth1 = revt / lag(revt) - 1)

# R way
uol$revt_growth2 = uol$revt / c(NA, uol$revt[-length(uol$revt)]) - 1

identical(uol$revt_growth1, uol$revt_growth2)
```

> You can use whichever you are comfortable with

## A note on mutate() {data-background="../Backgrounds/reference.jpg" class="default"}

- `mutate()` adds variables to an existing data frame
    - Also `mutate_all()`, `mutate_at()`, `mutate_if()`
       - `mutate_all()` applies a transformation to all values in a data frame and adds these to the data frame
       - `mutate_at()` does this for a set of specified variables
       - `mutate_if()` transforms all variables matching a condition
           - Such as `is.numeric`
- Mutate can be very powerful when making more complex variables
    - For instance: Calculating growth within company in a multi-company data frame

## Example: UOL with changes {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
# Make the other needed change
uol <- uol %>%
  mutate(at_growth = at / lag(at) - 1) %>%  # Calculate asset growth
  rename(revt_growth = revt_growth1)        # Rename for readability
# Run the OLS model
mod2 <- lm(revt_growth ~ at_growth, data = uol)
summary(mod2)
```

## Example: UOL with changes {data-background="../Backgrounds/case.jpg" class="default"}

- $\Delta$Assets doesn't capture $\Delta$Revenue so well
- Perhaps change in total assets is a bad choice?
- Or perhaps we need to expand our model?

## Scaling up! {data-background="../Backgrounds/default.jpg" class="default"}

$$
\hat{y}=\alpha + \beta_1 \hat{x}_1 + \beta_2 \hat{x}_2 + \ldots + \varepsilon
$$

- OLS doesn't need to be restricted to just 1 input!
    - Not unlimited though (yet -- we'll get there)
        - Number of inputs must be less than the number of observations minus 1
- Each $\hat{x}_i$ is an input in our model
- Each $\beta_i$ is something we will solve for
- $\hat{y}$, $\alpha$, and $\varepsilon$ are the same as before

## Scaling up our model {data-background="../Backgrounds/case.jpg" class="default"}

> We have... 464 variables from Compustat Global alone!

- Let's just add them all?

<div class="fragment">
<br>

- We only have 28 observations...
    - 28 << 464...

> Now what?

</div>

## Scaling up our model {data-background="../Backgrounds/group.jpg" class="default"}

> Building a model requires careful thought!

- This is where having accounting and business knowledge comes in!

> What makes sense to add to our model?

## Scaling up our model {data-background="../Backgrounds/answer.jpg" class="default exclude"}

- Some potential sources to consider:
    - Direct accounting relations
        - Financing and expenditures
    - Business management
        - Some management characteristics may matter
    - Economics
        - Macro econ: trade, economic growth, population, weather
        - Micro econ: Other related firms like suppliers and customers
    - Legal factors
        - Any changes in law?  Favorable or not?
    - Market factors
        - Interest rates, cost of capital, foreign exchange?

> That's a lot!

## Scaling up our model {data-background="../Backgrounds/answer.jpg" class="default exclude"}

- One possible improvement:

```{r}
# lct: short term liabilities, che: cash and equivalents, ebit: EBIT
uol <- uol %>%
  mutate_at(vars(lct, che, ebit), list(growth = ~. / lag(.) - 1))  # Calculate 3 growths
mod3 <- lm(revt_growth ~ lct_growth + che_growth + ebit_growth, data=uol)
summary(mod3)
```

## Practice: mutate() {data-background="../Backgrounds/coding.jpg" class="default"}

- This practice is to make sure you understand how to use mutate with lags
    - These are very important when dealing with business data!
- Do exercises 1 on today's R practice file:
    - <a href="http://rmc.link/Slides/acct420v3/Session_2/Session_2_R.html">R Practice</a>
    - Shortlink: <a href="http://rmc.link/Slides/acct420v3/Session_2/Session_2_R.html">rmc.link/420r2</a>

# Statistics Foundations {data-background="../Backgrounds/section.jpg" class="header"}

## Frequentist statistics {data-background="../Backgrounds/books-old.jpg" class="default"}

> A specific test is one of an infinite number of replications

- The "correct" answer should occur most frequently, i.e., with a high probability
- Focus on true vs false
- Treat unknowns as fixed constants to figure out
    - Not random quantities
- Where it's used
    - Classical statistics methods
        - Like OLS

## Bayesian statistics {data-background="../Backgrounds/books-old.jpg" class="default"}

> Focus on distributions and beliefs

- Prior distribution -- what is believed before the experiment
- Posterior distribution: an updated belief of the distribution due to the experiment
- Derive distributions of parameters
- Where it's used:
    - Many machine learning methods
        - Bayesian updating acts as the learning
    - Bayesian statistics

> A separate school of statistics thought

## Frequentist vs Bayesian methods {data-background="../Backgrounds/default.jpg" class="default"}

<a href="https://xkcd.com/1132/"><img src="https://imgs.xkcd.com/comics/frequentists_vs_bayesians.png" height="450px"></a>

<div class="fragment">

> This is why we use more than 1 data point

## Frequentist perspective: Repeat the test {data-background="../Backgrounds/microscope.jpg" class="default"}

```{r}
detector <- function() {
  dice <- sample(1:6, size=2, replace=TRUE)
  if (sum(dice) == 12) {
    "exploded"
  } else {
    "still there"
  }
}

experiment <- replicate(1000,detector())
# p value
p <- sum(experiment == "still there") / 1000
if (p < 0.05) {
  paste("p-value: ", p, "-- Fail to reject H_A, sun appears to have exploded")
} else {
  paste("p-value: ", p, "-- Reject H_A that sun exploded")
}
```

> Frequentist: The sun didn't explode

## Bayes persepctive: Bayes rule {data-background="../Backgrounds/blackboard.jpg" class="default"}

$$
P(A|B) = \frac{P(B|A) P(A)}{P(B)}
$$

- $A$: The sun exploded
- $B$: The detector said it exploded
- $P(A)$: Really, really small.  Say, ~0.
- $P(B)$: $\frac{1}{6}\times\frac{1}{6} = \frac{1}{36}$
- $P(B|A)$: $\frac{35}{36}$

$$
P(A|B) = \frac{P(B|A) P(A)}{P(B)} = \frac{\frac{35}{36}\times\sim 0}{\frac{1}{36}} = 35\times \sim 0 \approx 0
$$

> Bayesian: The sun didn't explode

## What analytics typically relies on {data-background="../Backgrounds/default.jpg" class="default"}

- Regression approaches
    - Most often done in a frequentist manner
    - Can be done in a Bayesian manner as well
- Artificial Intelligence
    - Often frequentist
    - Sometimes neither -- "It just works"
- Machine learning
    - Sometimes Bayesian, sometime frequentist
    - We'll see both

> We will use both to some extent -- for our purposes, we will not debate the merits of either school of thought, but we will use tools derived from both

## Confusion from frequentist approaches {data-background="../Backgrounds/default.jpg" class="default"}

- Possible contradictions:
    - $F$ test says the model is good yet nothing is statistically significant
    - Individual $p$-values are good yet the model isn't
    - One measure says the model is good yet another doesn't

> There are many ways to measure a model, each with their own merits.  They don't always agree, and it's on us to pick a reasonable measure.

# Formalizing frequentist testing {data-background="../Backgrounds/section.jpg" class="header"}

## Why formalize? {data-background="../Backgrounds/default.jpg" class="default"}

- Our current approach has been ad hoc
    - What is our goal?
    - How will we know if we have achieved it?
- Formalization provides more rigor

## Scientific method {data-background="../Backgrounds/reference.jpg" class="default"}

1. Question
    - What are we trying to determine?
2. Hypothesis
    - What do we think will happen?  Build a model
3. Prediction
    - What exactly will we test?  Formalize model into a statistical approach
4. Testing
    - Test the model
5. Analysis
    - Did it work?

## Hypotheses {data-background="../Backgrounds/reference.jpg" class="default"}

- Null hypothesis, a.k.a. $H_0$
    - The status quo
    - Typically: The model *doesn't* work
- Alternative hypothesis, a.k.a. $H_1$ or $H_A$
    - The model *does* work (and perhaps how it works)
- Frequentist statistics can never directly support $H_0$!
    - Only can fail to find support for $H_A$
    - Even if our $p$-value is 1, we can't say that the results prove the null hypothesis!

> We will use test statistics to test the hypotheses

## Regression {data-background="../Backgrounds/default.jpg" class="default"}

- Regression (like OLS) has the following assumptions
    1. The data is generated following some model
        - E.g., a linear model
            - In two weeks, a logistic model
    2. The data conforms to some statistical properties as required by the test
    3. The model coefficients are something to precisely determine
        - I.e., the coefficients are constants
    4. $p$-values provide a measure of the chance of an error in a particular aspect of the model
        - For instance, the p-value on $\beta_1$ in $y=\alpha + \beta_1 x_1 + \varepsilon$ essentially gives the probability that the sign of $\beta_1$ is wrong

## OLS Statistical properties {data-background="../Backgrounds/default.jpg" class="default"}

$$
\begin{align*}
  \text{Theory:}\quad y &= \alpha + \beta_1 x_1 + \beta_2 x_2 + \ldots + \varepsilon \\
  \text{Data:}\quad \hat{y} &= \alpha + \beta_1 \hat{x}_1 + \beta_2 \hat{x}_2 + \ldots + \hat{\varepsilon}
\end{align*}
$$

1. There should be a *linear* relationship between $y$ and each $x_i$
    - I.e., $y$ is [approximated by] a constant multiple of each $x_i$
    - Otherwise we **shouldn't** use a *linear* regression
2. Each $\hat{x}_i$ is normally distributed
    - Not so important with larger data sets, but a good to adhere to
3. Each observation is independent
    - We'll violate this one for the sake of *causality*
4. Homoskedasticity: Variance in errors is constant
    - This is important
5. Not too much multicollinearity
    - Each $\hat{x}_i$ should be relatively independent from the others
    - Some is OK

## Practical implications {data-background="../Backgrounds/default.jpg" class="default"}

> Models designed under a frequentist approach can only answer the question of "does this matter?"

- Is this a problem?

<div class="fragment exclude">

- Often, this is enough
    - But we [generally] can't answer the question "is this irrelevant?"

</div>

# Linear model implementation {data-background="../Backgrounds/section.jpg" class="header"}

## What exactly is a linear model? {data-background="../Backgrounds/default.jpg" class="default"}

- Anything OLS is linear
- Many transformations can be recast to linear
    - Ex.: $log(y) = \alpha + \beta_1 x_1 + \beta_2 x_2 + \beta_3 {x_1}^2 + \beta_4 x_1 \cdot x_2$
        - This is the same as $y' = \alpha + \beta_1 x_1 + \beta_2 x_2 + \beta_3 x_3 + \beta_4 x_4$ where:
            - $y' = log(y)$
            - $x_3 = {x_1}^2$
            - $x_4 = x_1 \cdot x_2$

> Linear models are *very* flexible

## Mental model of OLS: 1 input {data-background="../Backgrounds/default.jpg" class="default"}

<img src="../Figures/OLS_model.png" width="400px">

> Simple OLS measures a simple linear relationship between an input and an output

- E.g.: Our first regression this week: Revenue on assets

## Mental model of OLS: Multiple inputs {data-background="../Backgrounds/default.jpg" class="default"}

<img src="../Figures/OLS_model_m.png" width="400px">

> OLS measures simple linear relationships between a set of inputs and one output

- E.g.: This is what we did when scaling up earlier this session

## Other linear models: IV Regression (2SLS) {data-background="../Backgrounds/default.jpg" class="default"}

<img src="../Figures/2SLS_model.png" width="300px">

> IV/2SLS models linear relationships where the effect of some $x_i$ on $y$ may be confounded by outside factors. 

- E.g.: Modeling the effect of management pay duration (like bond duration) on firms' choice to issue earnings forecasts
    - Instrument with CEO tenure (Cheng, Cho, and Kim 2015)

## Other linear models: SUR {data-background="../Backgrounds/default.jpg" class="default"}

<img src="../Figures/SUR_model.png" width="300px">

> SUR models systems with related error terms

- E.g.: Modeling both revenue and earnings simultaneously

## Other linear models: 3SLS {data-background="../Backgrounds/default.jpg" class="default"}

<img src="../Figures/3SLS_model.png" width="300px">

> 3SLS models systems of equations with *related outputs*

- E.g.: Modeling stock return, volatility, and volume simultaneously

## Other linear models: SEM {data-background="../Backgrounds/default.jpg" class="default"}

<img src="../Figures/SEM_model.png" width="300px">

> SEM can model abstract and multi-level relationships

- E.g.: Showing that organizational commitment leads to higher job satisfaction, not the other way around (Poznanski and Bline 1999)

## Modeling choices: Model selection {data-background="../Backgrounds/default.jpg" class="default"}

> Pick what fits your problem!

- For forecasting a quantity:
    - Usually some sort of linear model regressed using OLS
    - The other model types mentioned are great for simultaneous forecasting of multiple outputs
- For forecasting a binary outcome:
    - Usually logit or a related model (we'll start this in 2 weeks)
- For forensics:
    - Usually logit or a related model

> There are many more model types though!

## Modeling choices: Variable selection {data-background="../Backgrounds/default.jpg" class="default"}

- The options:
    1. Use your own knowledge to select variables
    2. Use a selection model to automate it

<div class="clearfix">
<div class="left">
Own knowledge

- Build a model based on your knowledge of the problem and situation
- This is generally better
    - The result should be more interpretable
    - For prediction, you should know relationships better than most algorithms
</div>
<div class="right">
<img src="../Figures/brain.png" height="200px">
</div>
</div>

## Modeling choices: Automated selection {data-background="../Backgrounds/default.jpg" class="default"}

- Traditional methods include:
    - Forward selection: Start with nothing and add variables with the most contribution to Adj $R^2$ until it stops going up
    - Backward selection: Start with all inputs and remove variables with the worst (negative) contribution to Adj $R^2$ until it stops going up
    - Stepwise selection: Like forward selection, but drops non-significant predictors
- Newer methods:
    - Lasso and Elastic Net based models
        - Optimize with high penalties for complexity (i.e., # of inputs)
        - We will discuss these in week 5

<img src="../Figures/artificial-neural-network-3501528_640.png" height="150px">

## The overfitting problem {data-background="../Backgrounds/default.jpg" class="default"}

> Or: Why do we like simpler models so much?

- Overfitting happens when a model fits in-sample data *too well*...
    - To the point where it also models any idiosyncrasies or errors in the data
    - This harms prediction performance
        - Directly harming our forecasts

> An overfitted model works really well on its own data, and quite poorly on new data

# Statistical tests and Interpretation {data-background="../Backgrounds/section.jpg" class="header"}

## Coefficients {data-background="../Backgrounds/default.jpg" class="default"}

- In OLS: $\beta_i$

<div class="clearfix">
<div class="left">
- A change in $x_i$ by 1 leads to a change in $y$ by $\beta_i$
- Essentially, the slope between $x$ and $y$
- The blue line in the chart is the regression line for $\hat{Revenue} = \alpha + \beta_i \hat{Assets}$ for retail firms since 1960
</div>
<div class="right">
```{r, echo=F, warning=F, message=F}
library(tidyverse)
read_csv('../../Data/Session_3-1.csv') %>%
  ggplot(aes(y=revtq, x=atq)) + 
  geom_point() + 
  geom_smooth(method="lm") + 
  xlab("Assets") + 
  ylab("Revenue")
```
</div>
</div>

## P-values {data-background="../Backgrounds/default.jpg" class="default"}

- $p$-values tell us the probability that an individual result is due to random chance

> "The P value is defined as the probability under the assumption of no effect or no difference (null hypothesis), of obtaining a result equal to or more extreme than what was actually observed." <br> -- Dahiru 2008

- These are very useful, particularly for a frequentist approach
- First used in the 1700s, but popularized by Ronald Fisher in the 1920s and 1930s

## P-values: Rule of thumb {data-background="../Backgrounds/reference.jpg" class="default"}

- If $p<0.05$ and the coefficient sign matches our mental model, we can consider this as supporting our model
    - If $p<0.05$ but the coefficient is opposite, then it is suggesting a problem with our model
    - If $p>0.10$, it is rejecting the alternative hypothesis
- If $0.05 < p < 0.10$ it depends...
    - For a small dataset or a complex problem, we can use $0.10$ as a cutoff
    - For a huge dataset or a simple problem, we should use $0.05$
        - We may even set a lower threshold if we have a ton of data

## One vs two tailed tests {data-background="../Backgrounds/default.jpg" class="default"}

- Best practice:
    - **Use a two tailed test**
- Second best practice:
    - If you use a 1-tailed test, use a p-value cutoff of 0.025 or 0.05
        - This is equivalent to the best practice, just roundabout
- Common but generally inappropriate:
    - Use a one tailed test with cutoffs of 0.05 or 0.10 because your hypothesis is directional

```{r, fig.height=3, fig.width=4, echo=F, include=F}
plot_norm <- function(bound, outer) {
  x <- seq(-outer,outer,length=100)
  hx <- dnorm(x)
  plot(x, hx, type="n", xlab="z values", ylab="Normal PDF", main="Normal Distribution", axes=FALSE)
  lines(x, hx)
  i <- x < -bound
  polygon(c(-outer,x[i],-bound,-bound), c(0,hx[i],max(hx[i]),0), col="red")
  i <- x > bound
  polygon(c(bound, bound, x[i],outer), c(0,max(hx[i]), hx[i],0), col="red")
  axis(1, at=-outer:outer, pos=0)
}
plot_norm(1.96, 4)
```

<img src="../Figures/Normal_tails.png" width="384px">

## $R^2$ {data-background="../Backgrounds/default.jpg" class="default"}

- $R^2$ = Explained variation / Total variation
    - Variation = difference in the observed output variable from its own mean
- A high $R^2$ indicates that the model fits the data very well
- A low $R^2$ indicates that the model is missing much of the variation in the output
- $R^2$ is technically a *biased* estimator
- Adjusted $R^2$ downweights $R^2$ and makes it unbiased
    - $R^2_{Adj} = P R^2 + 1 - P$
        - Where $P=\frac{n-1}{n-p-1}$
        - $n$ is the number of observations
        - $p$ is the number of inputs in the model

## Test statistics {data-background="../Backgrounds/reference.jpg" class="default"}

- Testing a coefficient:
    - Use a $t$ or $z$ test
- Testing a model as a whole
    - $F$-test, check *adjusted* R squared as well
- Testing across models
    - Chi squared ($\chi^2$) test
    - Vuong test (comparing $R^2$)
    - <a href="https://en.wikipedia.org/wiki/Akaike_information_criterion">Akaike Information Criterion</a> (AIC) (Comparing MLEs, lower is better)

> All of these have p-values, except for AIC

# Causality {data-background="../Backgrounds/section.jpg" class="header"}

## What is causality? {data-background="../Backgrounds/default.jpg" class="default"}

$A \rightarrow B$

- Causality is $A$ *causing* $B$
    - This means more than $A$ and $B$ are correlated
- I.e., If $A$ changes, $B$ changes.  But $B$ changing doesn't mean $A$ changed
    - Unless $B$ is 100% driven by $A$
- Very difficult to determine, particularly for events that happen [almost] simultaneously
- <a href="http://tylervigen.com/spurious-correlations">Examples of correlations that aren't causation</a>

<a href="https://xkcd.com/552/"><img src="https://imgs.xkcd.com/comics/correlation.png"  height="200px"></a>

## Time and causality {data-background="../Backgrounds/default.jpg" class="default"}

$A \rightarrow B$ or $A \leftarrow B$?

$A_t \rightarrow B_{t+1}$

- If there is a separation in time, it's easier to say $A$ caused $B$
    - Observe $A$, then see if $B$ changes after
- Conveniently, we have this structure when forecasting
    - Consider a model like:

$$
Revenue_{t+1} = Revenue_t + \ldots
$$

## Time and causality break down {data-background="../Backgrounds/default.jpg" class="default"}

$A_t \rightarrow B_{t+1}$? $\quad$ OR $\quad$ $C \rightarrow A_t$ and $C \rightarrow B_{t+1}$?

- The above illustrates the *Correlated omitted variable problem*
    - $A$ doesn't cause $B$...  Instead, some other force $C$ causes both
    - The bane of social scientists everywhere
- This is less important for predictive analytics, as we care more about performance, but...
    - It can complicate interpreting your results
    - Figuring out $C$ can help improve you model's predictions
        - So find C!

<a href="https://xkcd.com/925/"><img src="https://imgs.xkcd.com/comics/cell_phones.png" height="200px"></a>












# Revisiting the previous problem {data-background="../Backgrounds/section.jpg" class="header"}

## Formalizing our last test {data-background="../Backgrounds/question.jpg" class="default"}

<div class="alignleft">

1. Question
    - $~$
2. Hypotheses
    - $H_0$: 
    - $H_1$: 
3. Prediction
    - $~$
4. Testing:
    - $~$
5. Statistical tests:
    - Individual variables:
    - Model:
</div>

## Formalizing our last test {data-background="../Backgrounds/answer.jpg" class="default exclude"}

1. Question
    - Can we predict changes in revenue using a firm's accounting information?
2. Hypotheses
    - $H_0$: Our variables do not predict UOL's change in revenue
    - $H_1$: Our variables help to predict UOL's change in revenue
3. Prediction
    - Use an OLS model
4. Same results as before
5. Statistical tests:
    - Individual variables
        - Growth in current liabilities loads (+) at $p<0.01$ using a t-test
        - Growth in EBIT loads (+) at $p<0.10$ using a t-test
    - Model: F-test is significant at $p<0.05$

## Is this model better? {data-background="../Backgrounds/default.jpg" class="default"}

```{r}
anova(mod2, mod3, test="Chisq")
```

> A bit better at $p<0.05$

- This means our model with change in current liabilities, cash, and EBIT appears to be better than the model with change in assets.

# Panel data {data-background="../Backgrounds/section.jpg" class="header"}

## Expanding our methodology {data-background="../Backgrounds/default.jpg" class="default"}

- Why should we limit ourselves to 1 firm's data?
- The nature of data analysis is such:

> Adding more data usually helps improve predictions

- Assuming:
    - The data isn't of low quality (too noisy)
    - The data is relevant
    - Any differences can be reasonably controlled for

## Expanding our question {data-background="../Backgrounds/default.jpg" class="default"}

- Previously: Can we predict revenue using a firm's accounting information?
    - This is simultaneous, and thus is not forecasting
- Now: Can we predict *future* revenue using a firm's accounting information?
    - By trying to predict ahead, we are now in the realm of forecasting
    - What do we need to change?
        - $\hat{y}$ will need to be 1 year in the future

## First things first {data-background="../Backgrounds/default.jpg" class="default"}

- When using a lot of data, it is important to make sure the data is clean
- In our case, we may want to remove any very small firms

```{r}
# Ensure firms have at least $1M (local currency), and have revenue
# df contains all real estate companies excluding North America
df_clean <- df %>%
  filter(at>1, revt>0)

# We cleaned out 578 observations!
print(c(nrow(df), nrow(df_clean)))

# Another useful cleaning funtion:
# Replaces NaN, Inf, and -Inf with NA for all numeric variables in the data!
df_clean <- df_clean %>%
  mutate_if(is.numeric, list(~replace(., !is.finite(.), NA)))
```


## Looking back at the prior models {data-background="../Backgrounds/case.jpg" class="default"}

```{r, message=F, warning=F}
uol <- uol %>% mutate(revt_lead = lead(revt))  # From dplyr
forecast1 <- lm(revt_lead ~ lct + che + ebit, data=uol)
library(broom)  # Lets us view bigger regression outputs in a tidy fashion
tidy(forecast1)  # Present regression output
glance(forecast1)  # Present regression statistics
```

> This model is ok, but we can do better.

## Expanding the prior model {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
forecast2 <- 
  lm(revt_lead ~ revt + act + che + lct + dp + ebit , data=uol)
tidy(forecast2)
```

- Revenue to capture stickiness of revenue
- Current assest & Cash (and equivalents) to capture asset base
- Current liabilities to capture payments due
- Depreciation to capture decrease in real estate asset values
- EBIT to capture operational performance

## Expanding the prior model {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
glance(forecast2)

anova(forecast1, forecast2, test="Chisq")
```

> This is better (Adj. $R^2$, $\chi^2$, AIC).

## Panel data {data-background="../Backgrounds/reference.jpg" class="default"}

- Panel data refers to data with the following characteristics:
    - There is a time dimension
    - There is at least 1 other dimension to the data (firm, country, etc.)
- Special cases:
    - A panel where all dimensions have the same number of observations is called *balanced*
        - Otherwise we call it *unbalanced*
    - A panel missing the time dimension is *cross-sectional*
    - A panel missing the other dimension(s) is a *time series*
- Format:
    - Long: Indexed by all dimensions
    - Wide: Indexed only by some dimensions

## Panel data {data-background="../Backgrounds/reference.jpg" class="default"}

<img src="../Figures/Panel_types.png" width="600px">

> Data frames are usually wide panels

## All Singapore real estate companies {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
# Note the group_by -- without it, lead() will pull from the subsequent firm!
# ungroup() tells R that we finished grouping
df_clean <- df_clean %>% 
  group_by(isin) %>% 
  mutate(revt_lead = lead(revt)) %>%
  ungroup()
```

<img src="../Figures/Grouping.png" height="400px">

## All Singapore real estate companies {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
forecast3 <-
  lm(revt_lead ~ revt + act + che + lct + dp + ebit,
     data=df_clean[df_clean$fic=="SGP",])
tidy(forecast3)
```

## All Singapore real estate companies {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
glance(forecast3)
```

> Lower adjusted $R^2$ -- This is worse?  Why?

- Note: $\chi^2$ can only be used for models on the same data
    - Same for AIC

## Worldwide real estate companies {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
forecast4 <-
  lm(revt_lead ~ revt + act + che + lct + dp + ebit , data=df_clean)
tidy(forecast4)
```

## Worldwide real estate companies {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
glance(forecast4)
```

> Higher adjusted $R^2$ -- better!

- Note: $\chi^2$ can only be used for models on the same data
    - Same for AIC

## Model accuracy {data-background="../Backgrounds/question.jpg" class="default"}

> Why is the UOL model better than the Singapore model?

- Ranking:
    1. Worldwide real estate model
    2. UOL model
    3. Singapore real estate model

<div class="fragment exclude">

> Different sources of noise, amounts of data

</div>

## Practice: group_by() {data-background="../Backgrounds/coding.jpg" class="default"}

- This practice is to make sure you understand how to use mutate with leads and lags when there are multiple companies in the data
    - We'll almost always work with multiple companies!
- Do exercises 2 and 3 on today's R practice file:
    - <a href="http://rmc.link/Slides/acct420v3/Session_2/Session_2_R.html">R Practice</a>
    - Shortlink: <a href="http://rmc.link/Slides/acct420v3/Session_2/Session_2_R.html">rmc.link/420r2</a>

# Dealing with noise {data-background="../Backgrounds/section.jpg" class="header"}

## Noise {data-background="../Backgrounds/default.jpg" class="default"}

> Statistical noise is random error in the data

- Many sources of noise:
    - Other factors not included in 
    - Error in measurement
        - Accounting measurement!
    - Unexpected events / shocks

> Noise is OK, but the more we remove, the better!

## Removing noise: Singapore model {data-background="../Backgrounds/case.jpg" class="default"}

- Different companies may behave slightly differently
    - Control for this using a *Fixed Effect*
    - Note: ISIN uniquely identifies companies

```{r}
forecast3.1 <-
  lm(revt_lead ~ revt + act + che + lct + dp + ebit + factor(isin),
     data=df_clean[df_clean$fic=="SGP",])
# n=7 to prevent outputting every fixed effect
print(tidy(forecast3.1), n=15)
```

## Removing noise: Singapore model {data-background="../Backgrounds/case.jpg" class="default"}

```{r}
glance(forecast3.1)
anova(forecast3, forecast3.1, test="Chisq")
```

> This isn't much different.  Why?  There is another source of noise within Singapore real estate companies

## Another way to do fixed effects {data-background="../Backgrounds/reference.jpg" class="default"}

- The library `package:lfe`  has `felm()`: **f**ixed **e**ffects **l**inear **m**odel
    - Better for complex models
    - Doesn't support prediction natively though

```{r, message=F, error=F, warning=F}
library(lfe)
forecast3.2 <-
  felm(revt_lead ~ revt + act + che + lct + dp + ebit | factor(isin),
       data=df_clean[df_clean$fic=="SGP",])
summary(forecast3.2)
```

## Why exactly would we use fixed effects? {data-background="../Backgrounds/reference.jpg" class="default"}

<div class="clearfix">
<div class="left">
- Fixed effects are used when the average of $\hat{y}$ varies by some group in our data
    - In our problem, the average revenue of each firm is different
- Fixed effects absorb this difference

```{r, echo=F, message=F, fig.height=4}
df_clean %>%
  filter(fic=="SGP") %>%
  group_by(isin) %>%
  mutate(mean_revt_lead=mean(revt_lead, na.rm=T)) %>%
  slice(1) %>%
  ungroup() %>%
  ggplot(aes(x=mean_revt_lead)) + geom_histogram(aes(y = ..density..)) +  geom_density(alpha=.4, fill="#FF6666")
```
</div>
<div class="right">
- Further reading:
    - Introductory Econometrics by Jeffrey M. Wooldridge

<img src="../Figures/Econometrics_text.jpg" height="400px">
</div>
</div>

## What else can we do? {data-background="../Backgrounds/group.jpg" class="default"}

> What else could we do to improve our prediction model?

- Assuming:
    1. We do not have access to international data
    2. We do have access to Singaporean firms' data
    3. We have access to any data that is publicly available

# End matter {data-background="../Backgrounds/ending.jpg" class="header"}

## For next week {data-background="../Backgrounds/ending.jpg" class="default"}

- For next week:
    - 2 chapters on Datacamp
    - First individual assignment
        - Do this one individually!
        - Turn in on eLearn before class in 2 weeks
- Survey on the class session at <a href="https://docs.google.com/forms/d/e/1FAIpQLScbFW-CIBc3Xj0IXYH5coKgnsjIJdNv-fKmIdW18S1FUI6azQ/viewform?usp=sf_link">rmc.link/420survey2</a>

## Packages used for these slides {data-background="../Backgrounds/coding.jpg" class="default"}

- `package:broom`
- `package:DT`
- `package:knitr`
- `package:lfe`
- `package:magrittr`
- `package:plotly`
- `package:revealjs`
- `package:tidyverse`


## Custom code {data-background="../Backgrounds/coding.jpg" class="default"}

<small style="width:100%">

```{r, eval=FALSE}
# Graph showing squared error (slide 4.6)
uolg <- uol[,c("at","revt")]
uolg$resid <- mod1$residuals
uolg$xleft <- ifelse(uolg$resid < 0,uolg$at,uolg$at - uolg$resid)
uolg$xright <- ifelse(uolg$resid < 0,uolg$at - uolg$resid, uol$at)
uolg$ytop <- ifelse(uolg$resid < 0,uolg$revt - uolg$resid,uol$revt)
uolg$ybottom <- ifelse(uolg$resid < 0,uolg$revt, uolg$revt - uolg$resid)
uolg$point <- TRUE

uolg2 <- uolg
uolg2$point <- FALSE
uolg2$at <- ifelse(uolg$resid < 0,uolg2$xright,uolg2$xleft)
uolg2$revt <- ifelse(uolg$resid < 0,uolg2$ytop,uolg2$ybottom)

uolg <- rbind(uolg, uolg2)

uolg %>% ggplot(aes(y=revt, x=at, group=point)) + 
         geom_point(aes(shape=point)) + 
         scale_shape_manual(values=c(NA,18)) + 
         geom_smooth(method="lm", se=FALSE) +
         geom_errorbarh(aes(xmax=xright, xmin = xleft)) + 
         geom_errorbar(aes(ymax=ytop, ymin = ybottom)) + 
         theme(legend.position="none")
```

```{r, eval=FALSE}
# Chart of mean revt_lead for Singaporean firms (slide 12.6)
df_clean %>%                                           # Our data frame
  filter(fic=="SGP") %>%                               # Select only Singaporean firms
  group_by(isin) %>%                                   # Group by firm
  mutate(mean_revt_lead=mean(revt_lead, na.rm=T)) %>%  # Determine each firm's mean revenue (lead)
  slice(1) %>%                                         # Take only the first observation for each group
  ungroup() %>%                                        # Ungroup (we don't need groups any more)
  ggplot(aes(x=mean_revt_lead)) +                      # Initialize plot and select data
  geom_histogram(aes(y = ..density..)) +               # Plots the histogram as a density so that geom_density is visible
  geom_density(alpha=.4, fill="#FF6666")               # Plots smoothed density 
```

</small>

```{r, include=F, echo=F}
# Exports for the following week
save(df_clean, forecast2, uol, forecast4, file = "../../Data/Session_2_export.RData")
```

## NOTES {class="never"}

Add an illustration of fixed effects
