Professor Aswath Damodaran suggests that we treat all of R&D expense as tax-deductible capital expenditures, for purposes of valuation, and this can have significant effects on operating income, capital and expected growth measures for firms with substantial research expenses.

# The following function converts R&D expenses from operating to capital expenses. 
# It makes the appropriate adjustments to operating income, net income, the book 
# value of assets and the book value of equity. It can also be used to convert other 
# intangible assets, such as human capital, into capital invested.
rd.capitalizer.f <- function(
  pre_tax_operating_income, # Current year's EBIT
  tax_rate,
  net_income,
  book_value_capital,
  capital_expenditures,
  depreciation_amortization,
  rd_amortization_period, # How many years do you want to amortize R&D expenses? this is the number 
  # of years between the expenditure and commercial benefits emerging from the expenditure. Use the 
  # function "rd.amortization.lookup.period.f" for suggested amortization period.
  current_rd_expense, # Current year's R&D expense. This is the expenditure on the asset in the 
  # most recent financial year.
  historical_rd_expenses # Enter R&D expenses for past years: the number of years that you will 
  # need to enter will be determined by the amortization period. The first entry is the year 
  # just prior to the most recent year. The second entry is two years prior and so on. Enter as 
  # many prior years as your amortizable life above. If your company has not been in existence for 
  # that long, enter only the years you have.
){
  n=length(historical_rd_expenses)
  v=c(1, (rd_amortization_period+-(1:5))/rd_amortization_period)
  rd_tbl=tibble(
    period=0:n,
    rd_expense=c(current_rd_expense, historical_rd_expenses)
  )
  rd_tbl=rd_tbl %>%
    mutate(
      unamortized_portion=rd_expense*v,
      current_amortization=ifelse(period!=0, rd_expense/rd_amortization_period, 0)
    )
  current_value_research_asset=sum(rd_tbl$unamortized_portion, na.rm=T)
  current_expenditure_asset=current_rd_expense
  current_amortization_asset=sum(rd_tbl$current_amortization, na.rm=T)
  
  rd_lst=list(
    without_capitalizing=list(
      pre_tax_operating_income=pre_tax_operating_income,
      after_tax_operating_income=pre_tax_operating_income*(1-tax_rate),
      net_income=net_income,
      book_value_capital=book_value_capital,
      return_capital=pre_tax_operating_income*(1-tax_rate)/book_value_capital,
      capital_expenditures=capital_expenditures,
      depreciation_amortization=depreciation_amortization
    ),
    with_capitalizing=list(
      pre_tax_operating_income=pre_tax_operating_income+current_expenditure_asset-current_amortization_asset,
      # This may look like a mistake, adding the (R&D - amortization) to the after-tax operating income and 
      # not tax adjusting it but it is intentional. It captures the tax benefits accruing to firms from the 
      # expensing of R&D, which will not be lost just because we decided to capitalize the expense for 
      # valuation purposes. If the tax law changes as well, this would have be after-tax.
      after_tax_operating_income=pre_tax_operating_income*(1-tax_rate)+current_expenditure_asset-current_amortization_asset,
      net_income=net_income+current_expenditure_asset-current_amortization_asset,
      book_value_capital=book_value_capital+current_value_research_asset,
      return_capital=(pre_tax_operating_income*(1-tax_rate)+current_expenditure_asset-current_amortization_asset)/
        (book_value_capital+current_value_research_asset),
      capital_expenditures=capital_expenditures+current_expenditure_asset,
      depreciation_amortization=depreciation_amortization+current_amortization_asset
    )
  )
  return(list(
    rd_adjustments=rd_lst, 
    current_value_research_asset=current_value_research_asset,
    current_expenditure_asset=current_expenditure_asset,
    current_amortization_asset=current_amortization_asset,
    rd_capitalizer=rd_tbl
  ))
}

lst=rd.capitalizer.f(
  pre_tax_operating_income=3195, 
  tax_rate=0.4, 
  net_income=1025, 
  book_value_capital=5256, 
  capital_expenditures=655, 
  depreciation_amortization=525, 
  rd_amortization_period=5, 
  current_rd_expense=1594, 
  historical_rd_expenses=c(1026, 698, 399, 211, 89)
)

tbl=bind_rows(
  without_capitalizing=lst$rd_adjustments$without_capitalizing,
  with_capitalizing=lst$rd_adjustments$with_capitalizing,
  .id="method"
) 

format.dt.f(
  tbl,
  perc_vars=names(tbl)[6],
  ron_vars=names(tbl)[-c(1, 6)]
)

Since R&D capitalization also pushes up the book value of equity, and by extension, the invested capital in the firm, we can also look at the effect of capitalizing R&D on invested capital and return on invested capital across industries.

Raw data

raw_data=readr::read_csv(file.path(path_data, "global_industry_average_2022.csv")) %>%
  janitor::clean_names()

#-----------------------------------------------------------
#-----------------------------------------------------------
selected_raw_data=raw_data %>%
  select(
    industry_name,
    number_of_firms,
    capitalized_r_d,
    trailing_operating_income_adj_for_leases,
    operating_income_adjusted_for_leases_r_d,
    r_d_expense_ltm_us_dmm_historical_rate,
    r_d_expense_ltm_1_us_dmm_historical_rate,
    r_d_expense_ltm_2_us_dmm_historical_rate,
    r_d_expense_ltm_3_us_dmm_historical_rate,
    r_d_expense_ltm_4_us_dmm_historical_rate,
    r_d_expense_ltm_5_us_dmm_historical_rate,
    operating_lease_commitment_due_1_latest_annual_us_dmm_historical_rate,         
    operating_lease_commitment_due_2_latest_annual_us_dmm_historical_rate,         
    operating_lease_commitment_due_3_latest_annual_us_dmm_historical_rate,         
    operating_lease_commitment_due_4_latest_annual_us_dmm_historical_rate,         
    operating_lease_commitment_due_5_latest_annual_us_dmm_historical_rate,          
    operating_lease_commitment_due_after_5_yrs_latest_annual_us_dmm_historical_rate,
    pre_tax_cost_of_debt_in_us,
    # https://github.com/rnfermincota/academic/blob/main/research/traditional_assets/database/effective-cost-debt.pdf
    total_debt_incl_leases_in_us, 
    total_debt_without_oper_leases,
    # EBIT [LTM] ($USDmm, Historical rate)
    ebit_ltm_us_dmm_historical_rate,
    invested_capital_4_qtre_ago,
    effective_tax_rate,
    lease_adjusted_after_tax_roic,
    lease_r_d_adjusted_after_tax_roic
  ) %>%
  mutate(
    r_d_expense_ltm_us_dmm_historical_rate=if_else(
      is.na(r_d_expense_ltm_us_dmm_historical_rate), 0, r_d_expense_ltm_us_dmm_historical_rate
    ),
    r_d_expense_ltm_1_us_dmm_historical_rate=if_else(
      is.na(r_d_expense_ltm_1_us_dmm_historical_rate), 0, r_d_expense_ltm_1_us_dmm_historical_rate
    ),
    r_d_expense_ltm_2_us_dmm_historical_rate=if_else(
      is.na(r_d_expense_ltm_2_us_dmm_historical_rate), 0, r_d_expense_ltm_2_us_dmm_historical_rate
    ),
    r_d_expense_ltm_3_us_dmm_historical_rate=if_else(
      is.na(r_d_expense_ltm_3_us_dmm_historical_rate), 0, r_d_expense_ltm_3_us_dmm_historical_rate
    ),
    r_d_expense_ltm_4_us_dmm_historical_rate=if_else(
      is.na(r_d_expense_ltm_4_us_dmm_historical_rate), 0, r_d_expense_ltm_4_us_dmm_historical_rate
    ),
    r_d_expense_ltm_5_us_dmm_historical_rate=if_else(
      is.na(r_d_expense_ltm_5_us_dmm_historical_rate), 0, r_d_expense_ltm_5_us_dmm_historical_rate
    )
  )

# names(raw_data)[stringr::str_detect(names(raw_data), "tax")]
format.dt.f(
  selected_raw_data,
  perc_vars=names(selected_raw_data)[c(17, 22:24)],
  ron_vars=names(selected_raw_data)[-c(1, 17, 22:24)]
)

R&D Expenses and Operating Leases Adjustments

Now that both US GAAP (ASC 842) and IFRS (IFRS 16) have come to their senses and require companies to treat all leases as debt, thus creating a significant change in the balance sheet debt of all public companies. Consequently, analysts must start treating leases as debt in valuation, and the process for doing so is neither complicated nor novel. Starting with the lease commitment table that is included in the footnotes today, discount each lease commitment back to today, using the pre-tax cost of debt as your discount rate (since the lease commitments are pre-tax).

validation_tbl=selected_raw_data %>%
  mutate( # Value of Research Asset: Converts R&D expenses from operating to capital expenses. 
    # https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1297092
    # https://github.com/rnfermincota/academic/blob/main/teaching/Ivey/8.%20Nico-Add-Ins/backup/FINAN_FUNDAM_INDUSTRIES_LIBR.bas
    capitalized_rd2=capitalized_r_d,
    capitalized_rd1=pmap_dbl(list(
      r_d_expense_ltm_us_dmm_historical_rate=r_d_expense_ltm_us_dmm_historical_rate,
      r_d_expense_ltm_1_us_dmm_historical_rate=r_d_expense_ltm_1_us_dmm_historical_rate,
      r_d_expense_ltm_2_us_dmm_historical_rate=r_d_expense_ltm_2_us_dmm_historical_rate,
      r_d_expense_ltm_3_us_dmm_historical_rate=r_d_expense_ltm_3_us_dmm_historical_rate,
      r_d_expense_ltm_4_us_dmm_historical_rate=r_d_expense_ltm_4_us_dmm_historical_rate,
      r_d_expense_ltm_5_us_dmm_historical_rate=r_d_expense_ltm_5_us_dmm_historical_rate
    ),
    function(...){
      inps=list(...)
      # Periods to amortize R&D expenses: over how many years do you want to amortize R&D expenses
      n=ifelse(inps$r_d_expense_ltm_1_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_2_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_3_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_4_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_5_us_dmm_historical_rate>0,1,0)
      if (n > 0){
        inps$r_d_expense_ltm_us_dmm_historical_rate+
          max(0,inps$r_d_expense_ltm_1_us_dmm_historical_rate*(n-1)/n)+
          max(0,inps$r_d_expense_ltm_2_us_dmm_historical_rate*(n-2)/n)+
          max(0,inps$r_d_expense_ltm_3_us_dmm_historical_rate*(n-3)/n)+
          max(0,inps$r_d_expense_ltm_4_us_dmm_historical_rate*(n-4)/n)+
          max(0,inps$r_d_expense_ltm_5_us_dmm_historical_rate*(n-5)/n)
      } else {
        0 # NA
      }
    }),
    # Current year’s R&D expense - Amortization of R&D
    rd_expenses_amortization=pmap_dbl(list(
      r_d_expense_ltm_us_dmm_historical_rate=r_d_expense_ltm_us_dmm_historical_rate,
      r_d_expense_ltm_1_us_dmm_historical_rate=r_d_expense_ltm_1_us_dmm_historical_rate,
      r_d_expense_ltm_2_us_dmm_historical_rate=r_d_expense_ltm_2_us_dmm_historical_rate,
      r_d_expense_ltm_3_us_dmm_historical_rate=r_d_expense_ltm_3_us_dmm_historical_rate,
      r_d_expense_ltm_4_us_dmm_historical_rate=r_d_expense_ltm_4_us_dmm_historical_rate,
      r_d_expense_ltm_5_us_dmm_historical_rate=r_d_expense_ltm_5_us_dmm_historical_rate
    ),
    function(...){
      inps=list(...)
      # Periods to amortize R&D expenses: over how many years do you want to amortize R&D expenses
      n=ifelse(inps$r_d_expense_ltm_1_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_2_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_3_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_4_us_dmm_historical_rate>0,1,0)+
        ifelse(inps$r_d_expense_ltm_5_us_dmm_historical_rate>0,1,0)
      if (n > 0){
        s=inps$r_d_expense_ltm_1_us_dmm_historical_rate+
          inps$r_d_expense_ltm_2_us_dmm_historical_rate+
          inps$r_d_expense_ltm_3_us_dmm_historical_rate+
          inps$r_d_expense_ltm_4_us_dmm_historical_rate+
          inps$r_d_expense_ltm_5_us_dmm_historical_rate
        inps$r_d_expense_ltm_us_dmm_historical_rate-s/n
      } else {
        0 # NA
      }
    }),
    # Converting Operating Leases into debt
    # References: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=1435166
    # Lease Debt (My Estimate) vs. Lease Debt (Accounting -> Total Operating Leases [Latest Quarter])
    capitalized_leases1=pmap_dbl(list(
      operating_lease_commitment_due_1_latest_annual_us_dmm_historical_rate=
        operating_lease_commitment_due_1_latest_annual_us_dmm_historical_rate,         
      operating_lease_commitment_due_2_latest_annual_us_dmm_historical_rate=
        operating_lease_commitment_due_2_latest_annual_us_dmm_historical_rate,         
      operating_lease_commitment_due_3_latest_annual_us_dmm_historical_rate=
        operating_lease_commitment_due_3_latest_annual_us_dmm_historical_rate,         
      operating_lease_commitment_due_4_latest_annual_us_dmm_historical_rate=
        operating_lease_commitment_due_4_latest_annual_us_dmm_historical_rate,         
      operating_lease_commitment_due_5_latest_annual_us_dmm_historical_rate=
        operating_lease_commitment_due_5_latest_annual_us_dmm_historical_rate,          
      operating_lease_commitment_due_after_5_yrs_latest_annual_us_dmm_historical_rate=
        operating_lease_commitment_due_after_5_yrs_latest_annual_us_dmm_historical_rate,
      pre_tax_cost_of_debt_in_us=pre_tax_cost_of_debt_in_us
    ),
    function(...){
      inps=list(...)
      rst=inps$operating_lease_commitment_due_1_latest_annual_us_dmm_historical_rate/(1+inps$pre_tax_cost_of_debt_in_us)^1+
        inps$operating_lease_commitment_due_2_latest_annual_us_dmm_historical_rate/(1+inps$pre_tax_cost_of_debt_in_us)^2+
        inps$operating_lease_commitment_due_3_latest_annual_us_dmm_historical_rate/(1+inps$pre_tax_cost_of_debt_in_us)^3+
        inps$operating_lease_commitment_due_4_latest_annual_us_dmm_historical_rate/(1+inps$pre_tax_cost_of_debt_in_us)^4+
        inps$operating_lease_commitment_due_5_latest_annual_us_dmm_historical_rate/(1+inps$pre_tax_cost_of_debt_in_us)^5+
        inps$operating_lease_commitment_due_after_5_yrs_latest_annual_us_dmm_historical_rate/(1+inps$pre_tax_cost_of_debt_in_us)^7.5 # n+1
      rst
    }),
    capitalized_leases2=total_debt_incl_leases_in_us-total_debt_without_oper_leases,
    # Depreciation on leased asset. use straight line depreciation
    leases_depreciation=capitalized_leases1/5, # /n
    
    operating_income=ebit_ltm_us_dmm_historical_rate,
    operating_income_adj_leases1=ebit_ltm_us_dmm_historical_rate+
      (operating_lease_commitment_due_1_latest_annual_us_dmm_historical_rate-leases_depreciation),
    operating_income_adj_leases2=trailing_operating_income_adj_for_leases,
    
    # appropriate adjustments to operating income, net income, the book value of assets and 
    # the book value of equity.
    operating_income_adj_leases_rd1=ebit_ltm_us_dmm_historical_rate+
      (operating_lease_commitment_due_1_latest_annual_us_dmm_historical_rate-leases_depreciation)+
      rd_expenses_amortization, 
    # Please keep in mind that Damodaran's data website https://pages.stern.nyu.edu/~adamodar/New_Home_Page/datacurrent.html has inconsistencies for calculating operating income adjusted for leases & R&D, among many other variables.
    operating_income_adj_leases_rd2=operating_income_adjusted_for_leases_r_d, # revised!
    
    roic=(ebit_ltm_us_dmm_historical_rate*(1-effective_tax_rate))/invested_capital_4_qtre_ago,
    roic_adj_leases1=((ebit_ltm_us_dmm_historical_rate+
      (operating_lease_commitment_due_1_latest_annual_us_dmm_historical_rate-leases_depreciation))*
      (1-effective_tax_rate))/invested_capital_4_qtre_ago,
    roic_adj_leases2=lease_adjusted_after_tax_roic,
    roic_adj_leases_rd1=(operating_income_adj_leases_rd1*(1-effective_tax_rate))/(invested_capital_4_qtre_ago+capitalized_rd1),
    roic_adj_leases_rd2=lease_r_d_adjusted_after_tax_roic
  ) %>%
  select(
    industry_name, number_of_firms,
    capitalized_rd2, capitalized_rd1, 
    capitalized_leases1, capitalized_leases2,
    operating_income,
    operating_income_adj_leases1, operating_income_adj_leases2,
    operating_income_adj_leases_rd1, operating_income_adj_leases_rd2,
    roic, roic_adj_leases1, roic_adj_leases2, roic_adj_leases_rd1, roic_adj_leases_rd2
  )


all.equal(validation_tbl$capitalized_leases1, validation_tbl$capitalized_leases2)
[1] TRUE
all.equal(validation_tbl$capitalized_rd1, validation_tbl$capitalized_rd2)
[1] TRUE
all.equal(validation_tbl$operating_income_adj_leases1, validation_tbl$operating_income_adj_leases2)
[1] TRUE
all.equal(validation_tbl$operating_income_adj_leases_rd1, validation_tbl$operating_income_adj_leases_rd2)
[1] TRUE
all.equal(validation_tbl$roic_adj_leases1, validation_tbl$roic_adj_leases2)
[1] TRUE
all.equal(validation_tbl$roic_adj_leases_rd1, validation_tbl$roic_adj_leases_rd2)
[1] TRUE

tbl=validation_tbl %>%
  select(
    industry_name,
    number_of_firms,
    capitalized_leases=capitalized_leases1, 
    capitalized_rd=capitalized_rd1,
    operating_income=operating_income,
    operating_income_adj_leases=operating_income_adj_leases1, 
    operating_income_adj_leases_rd=operating_income_adj_leases_rd1, 
    roic=roic,
    roic_adj_leases=roic_adj_leases1, 
    roic_adj_leases_rd=roic_adj_leases_rd1
  )

format.dt.f(
  tbl,
  perc_vars=names(tbl)[c(8:10)],
  ron_vars=names(tbl)[-c(1, 8:10)]
)

References

[1] Research and Development Expenses: Implications for Profitability Measurement and Valuation

[2] Leases, Debt and Value

[3] Effective Cost of Debt

[4] META Lesson 2: Accounting Inconsistencies and Consequences

[5] ROIC and Intangible Assets by M. Mauboussin and D. Callahan