rm(list=ls())
set.seed(1234)
getwd()
## [1] "C:/Users/ASUS/Desktop/_pk_live/1.DataAnalysis/0.Code"
library("tidyverse")
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library("arrow")
## 
## 载入程序包:'arrow'
## 
## The following object is masked from 'package:lubridate':
## 
##     duration
## 
## The following object is masked from 'package:utils':
## 
##     timestamp
library(data.table)
## 
## 载入程序包:'data.table'
## 
## The following objects are masked from 'package:lubridate':
## 
##     hour, isoweek, mday, minute, month, quarter, second, wday, week,
##     yday, year
## 
## The following objects are masked from 'package:dplyr':
## 
##     between, first, last
## 
## The following object is masked from 'package:purrr':
## 
##     transpose
library(modelsummary)
## `modelsummary` 2.0.0 now uses `tinytable` as its default table-drawing
##   backend. Learn more at: https://vincentarelbundock.github.io/tinytable/
## 
## Revert to `kableExtra` for one session:
## 
##   options(modelsummary_factory_default = 'kableExtra')
##   options(modelsummary_factory_latex = 'kableExtra')
##   options(modelsummary_factory_html = 'kableExtra')
## 
## Silence this message forever:
## 
##   config_modelsummary(startup_message = FALSE)
library(tinytable)
setwd("C:/Users/ASUS/Desktop/_pk_live/1.DataAnalysis")

2023.01.01–2023.02.01:一个月的数据

1.summary data

df= read.csv("../1.Input/All_live_data.csv")
cols <- c(
  "is_pk_live",
  # Control Variables
  "gender_number",
  "age_range_number",
  "author_type_number",
  "fre_country_region_number",
  "fre_city_level_number",
  "log_fans_num",
  "log_history_total_cost",
  "log_history_valid_play_duration",
  "log_history_comment_cnt",
  "log_history_like_cnt",
  # Dependent Variables
  "log_total_cost_amt",
  "log_avg_valid_play_duration",
  "log_follow_author_cnt",
  "log_cancel_follow_author_cnt",
  "log_follow_user_cnt",
  "log_join_fans_group_cnt"
)

crs <- c(
  # PK in Session
  "is_pk_live" = "PK in Session",

  # Control Variables
  "gender_number" = "Gender",
  "age_range_number" = "Age Category",
  "author_type_number" = "Streamer Type",
  "fre_country_region_number" = "Region",
  "fre_city_level_number" = "City Level",
  "log_fans_num" = "Fan Count (log)",
  "log_history_total_cost" = "Historical Gifting (log)",
  "log_history_valid_play_duration" = "Historical View Time (log)",
  "log_history_comment_cnt" = "Historical Comment Count (log)",
  "log_history_like_cnt" = "Historical Like Count (log)",

  # Dependent Variables
  "log_total_cost_amt" = "Total Gifting (log)",
  "log_avg_valid_play_duration" = "Avg Play Duration Per Viewer (log)",
  "log_follow_author_cnt" = "New Followers (log)",
  "log_cancel_follow_author_cnt" = "Lost Followers (log)",
  "log_follow_user_cnt" = "Viewer-to-Viewer Follows (log)",
  "log_join_fans_group_cnt" = "New Loyal Fans (log)"
)

reversed_coef_rename <- setNames(names(crs), crs)

df_summary <- df %>% 
  select(cols) %>% 
  rename(all_of(reversed_coef_rename))
## Warning: Using an external vector in selections was deprecated in tidyselect 1.1.0.
## ℹ Please use `all_of()` or `any_of()` instead.
##   # Was:
##   data %>% select(cols)
## 
##   # Now:
##   data %>% select(all_of(cols))
## 
## See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Obs = function(x) sum(!is.na(x))
datasummary(All(df_summary) ~ Obs + Mean + SD + Min + Max,
            data = df_summary,
            title = 'Summary Statistics \\label{tab:summary}', escape=FALSE,
            fmt = 2, output = "../2.Output/all_live_summary.tex")
## Warning: To compile a LaTeX document with this table, the following commands must be placed in the document preamble:
## 
## \usepackage{tabularray}
## \usepackage{float}
## \usepackage{graphicx}
## \usepackage{codehigh}
## \usepackage[normalem]{ulem}
## \UseTblrLibrary{booktabs}
## \UseTblrLibrary{siunitx}
## \newcommand{\tinytableTabularrayUnderline}[1]{\underline{#1}}
## \newcommand{\tinytableTabularrayStrikeout}[1]{\sout{#1}}
## \NewTableCommand{\tinytableDefineColor}[3]{\definecolor{#1}{#2}{#3}}
## 
## To disable `siunitx` and prevent `modelsummary` from wrapping numeric entries in `\num{}`, call:
## 
## options("modelsummary_format_numeric_latex" = "plain")
##  This warning appears once per session.

2.OLS

library(fixest)
model1 = feols(total_cost_amt~is_pk_live|author_id + p_date,data = df,vcov = ~author_id)
summary(model1)
## OLS estimation, Dep. Var.: total_cost_amt
## Observations: 196,684
## Fixed-effects: author_id: 55,824,  p_date: 32
## Standard-errors: Clustered (author_id) 
##            Estimate Std. Error  t value Pr(>|t|) 
## is_pk_live  166.094    203.784 0.815046  0.41505 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 3,848.3     Adj. R2: 0.468529
##                 Within R2: 4.052e-5
model2 = feols(log(avg_valid_play_duration + 1)~is_pk_live|author_id + p_date,data = df,vcov = ~author_id)
summary(model2)
## OLS estimation, Dep. Var.: log(avg_valid_play_duration + 1)
## Observations: 196,684
## Fixed-effects: author_id: 55,824,  p_date: 32
## Standard-errors: Clustered (author_id) 
##            Estimate Std. Error t value  Pr(>|t|)    
## is_pk_live 0.640031   0.019933 32.1083 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 1.63797     Adj. R2: 0.271545
##                 Within R2: 0.00331
model3 = feols(log(follow_author_cnt + 1)~is_pk_live|author_id + p_date,data = df[df$day>7,],vcov = ~author_id)
summary(model3)
## OLS estimation, Dep. Var.: log(follow_author_cnt + 1)
## Observations: 143,647
## Fixed-effects: author_id: 50,949,  p_date: 24
## Standard-errors: Clustered (author_id) 
##            Estimate Std. Error t value  Pr(>|t|)    
## is_pk_live 0.330476   0.016739 19.7433 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 0.587203     Adj. R2: 0.736113
##                  Within R2: 0.006158
model4 = feols(log(cancel_follow_author_cnt + 1)~is_pk_live|author_id + p_date,data = df[df$day>7,],vcov = ~author_id)
summary(model4)
## OLS estimation, Dep. Var.: log(cancel_follow_author_cnt + 1)
## Observations: 143,647
## Fixed-effects: author_id: 50,949,  p_date: 24
## Standard-errors: Clustered (author_id) 
##            Estimate Std. Error t value  Pr(>|t|)    
## is_pk_live 0.198087   0.011952 16.5729 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 0.410375     Adj. R2: 0.763615
##                  Within R2: 0.004537
model5 = feols(log(follow_user_cnt + 1)~is_pk_live|author_id + p_date,data = df[df$day>7,],vcov = ~author_id)
summary(model5)
## OLS estimation, Dep. Var.: log(follow_user_cnt + 1)
## Observations: 143,647
## Fixed-effects: author_id: 50,949,  p_date: 24
## Standard-errors: Clustered (author_id) 
##            Estimate Std. Error t value  Pr(>|t|)    
## is_pk_live 0.161163   0.012114 13.3034 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 0.410138     Adj. R2: 0.580823
##                  Within R2: 0.003011
model6 = feols(log(join_fans_group_cnt + 1)~is_pk_live|author_id + p_date,data = df[df$day>7,],vcov = ~author_id)
summary(model6)
## OLS estimation, Dep. Var.: log(join_fans_group_cnt + 1)
## Observations: 143,647
## Fixed-effects: author_id: 50,949,  p_date: 24
## Standard-errors: Clustered (author_id) 
##            Estimate Std. Error t value  Pr(>|t|)    
## is_pk_live 0.070047   0.007529 9.30336 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## RMSE: 0.270319     Adj. R2: 0.628248
##                  Within R2: 0.001312

3.Double ML

source("DoubleML_function.R")
## 载入需要的程序包:viridisLite
#直接把这些categorical变量变成one-hot vectors,这样会省去后面ML的麻烦
dummy_vars <- model.matrix(~ gender_number + age_range_number + author_type_number + fre_country_region_number + fre_city_level_number,  # + relative_day
                                  data = df)[, -1]
dummy_vars <- as.data.table(dummy_vars)

# # Replace non-ASCII characters with valid ASCII names
# clean_column_names <- function(names) {
#   # Replace specific Chinese characters with their English equivalents
#   names <- gsub("电商", "Commerce", names)  # Replace '电商' with 'Commerce'
#   names <- gsub("秀场", "Showcase", names)  # Replace '秀场' with 'Showcase'
#   # 因为一些ML模型里R的变量名不可以是中文,所以变成dummy后一些变量名要改
#   # Optionally, if there are other Chinese characters, you can continue to add more replacements here
#   
#   # Additionally, ensure names comply with general naming conventions
#   names <- make.names(names)  # This replaces any other special characters with valid R names
#   
#   return(names)
# }
# 
# # Apply the function to clean the column names in dummy_vars
# setnames(dummy_vars, old = colnames(dummy_vars), new = clean_column_names(colnames(dummy_vars)))
# df_with_dummies <- cbind(df, dummy_vars)
df_with_dummies =df
#把dummies和continuous covariates结合起来
features_base <- c("log_fans_num", "log_history_total_cost",
                   "log_history_valid_play_duration", "log_history_comment_cnt",
                   "log_history_like_cnt",
                   colnames(dummy_vars))
#把date format改成numeric,数据转换为data.table
df_with_dummies <- df_with_dummies %>% mutate(across(where(is.Date), as.numeric)) %>% 
as.data.table()
category <- c("log_total_cost_amt", "log_avg_valid_play_duration", "log_follow_author_cnt", 
              "log_cancel_follow_author_cnt", "log_follow_user_cnt", "log_join_fans_group_cnt")

crs <- c(
  "log_total_cost_amt" = "Total Gifting (log)",
  "log_avg_valid_play_duration" = "Avg Play Duration Per Viewer (log)",
  "log_follow_author_cnt" = "New Followers (log)",
  "log_cancel_follow_author_cnt" = "Lost Followers (log)",
  "log_follow_user_cnt" = "Viewer-to-Viewer Follows (log)",
  "log_join_fans_group_cnt" = "New Loyal Fans (log)"
)

(1) log(Y+1)

log_total_cost_amt_result = run_dml_plr_models(df_with_dummies, Y = "log_total_cost_amt", D = "is_pk_live", Xs = features_base, crs=crs)
## INFO  [15:19:55.621] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:19:57.589] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:19:58.808] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:20:00.181] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:20:07.374] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:20:14.616] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:20:22.340] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:20:42.701] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:21:13.539] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:21:44.393] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:22:07.776] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:22:30.176] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:22:54.956] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:22:55.377] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:22:55.742] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:22:56.445] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:22:56.981] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:22:57.592] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:22:59.004] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:23:01.678] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:23:04.311] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:23:06.953] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:23:09.699] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:23:12.365] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
## 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.
## Warning: The `size` argument of `element_rect()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
log_avg_valid_play_duration_result = run_dml_plr_models(df_with_dummies, Y = "log_avg_valid_play_duration", D = "is_pk_live", Xs = features_base, crs=crs)
## INFO  [15:23:16.572] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:23:17.836] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:23:19.245] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:23:20.833] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:23:30.140] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:23:39.327] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:23:48.878] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:24:21.824] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:24:54.807] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:25:23.123] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:25:44.892] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:26:05.693] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:26:29.026] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:26:29.488] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:26:29.910] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:26:30.633] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:26:31.311] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:26:31.878] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:26:33.539] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:26:36.710] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:26:39.863] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:26:43.359] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:26:47.139] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:26:50.675] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log_follow_author_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log_follow_author_cnt", D = "is_pk_live", Xs = features_base, crs=crs)
## INFO  [15:26:55.600] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:26:57.178] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:26:58.634] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:27:00.552] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:27:12.035] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:27:23.158] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:27:35.368] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:28:04.625] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:28:30.693] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:28:56.626] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:29:14.262] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:29:36.030] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:29:58.396] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:29:58.750] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:29:59.090] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:29:59.730] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:30:00.355] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:30:00.909] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:30:02.174] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:30:04.517] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:30:06.924] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:30:09.558] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:30:12.351] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:30:15.156] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log_cancel_follow_author_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log_cancel_follow_author_cnt", D = "is_pk_live", Xs = features_base, crs=crs)
## INFO  [15:30:18.891] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:30:20.325] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:30:21.724] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:30:23.238] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:30:32.127] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:30:40.119] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:30:49.138] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:31:10.730] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:31:31.755] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:31:53.376] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:32:10.916] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:32:28.566] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:32:46.420] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:32:46.694] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:32:47.078] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:32:47.603] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:32:48.136] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:32:48.597] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:32:49.856] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:32:52.147] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:32:54.500] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:32:56.952] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:32:59.578] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:33:02.300] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log_follow_user_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log_follow_user_cnt", D = "is_pk_live", Xs = features_base, crs=crs)
## INFO  [15:33:05.937] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:33:07.384] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:33:08.865] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:33:10.431] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:33:18.859] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:33:28.476] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:33:38.002] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:34:02.548] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:34:23.570] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:34:47.094] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:35:03.411] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:35:19.001] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:35:35.180] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:35:35.455] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:35:35.779] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:35:36.268] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:35:36.726] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:35:37.206] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:35:38.309] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:35:40.479] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:35:42.664] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:35:44.988] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:35:47.333] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:35:49.882] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log_join_fans_group_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log_join_fans_group_cnt", D = "is_pk_live", Xs = features_base, crs=crs)
## INFO  [15:35:53.289] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:35:54.521] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:35:55.540] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:35:56.900] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:36:04.300] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:36:12.242] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:36:23.891] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:36:43.738] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:37:01.658] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:37:21.679] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:37:39.241] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:37:56.203] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:38:14.263] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:38:14.612] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:38:14.887] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:38:15.473] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:38:15.940] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:38:16.412] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:38:17.879] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:38:19.973] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:38:22.070] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:38:24.308] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:38:26.720] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:38:29.135] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
MS_list <- list()
for (var in category) {
  new_var <- crs[[var]]
  MS_list[[new_var]] <- get(paste0(var, "_result"))[['mod']]
  
  ggsave(paste0("../2.Output/DML_PK_vs_NonPK_", var, ".pdf"), plot = get(paste0(var, "_result"))[['plot']], device = "pdf", width = 16, height = 9, units = "in")
  ggsave(paste0("../2.Output/DML_PK_vs_NonPK_", var, ".png"), plot = get(paste0(var, "_result"))[['plot']], device = "png", width = 16, height = 9, dpi = 300, units = "in")
  
}
modelsummary(MS_list)
Total Gifting (log) Avg Play Duration Per Viewer (log) New Followers (log) Lost Followers (log) Viewer-to-Viewer Follows (log) New Loyal Fans (log)
LASSO 0.879 0.477 0.192 0.096 0.170 0.023
(0.025) (0.012) (0.015) (0.011) (0.012) (0.007)
Random Forest 0.940 0.507 0.298 0.192 0.207 0.059
(0.025) (0.012) (0.013) (0.009) (0.010) (0.006)
Regression Tree 0.945 0.491 0.306 0.188 0.249 0.071
(0.025) (0.012) (0.014) (0.010) (0.010) (0.006)
Boosted Trees 0.910 0.439 0.296 0.190 0.203 0.065
(0.024) (0.013) (0.013) (0.009) (0.009) (0.006)
Obs 196684 196684 196684 196684 196684 196684
save_model_summaries <- function(list, new_cate_name) {
modelsummary(list, stars = c('+' = .1, '*' = .05, '**' = .01, '***' = .001), 
             output = paste0("../2.Output/", new_cate_name, ".docx"))

title = paste0('The Impact of PK Event',
                            '\\label{tab:', new_cate_name, '}')

modelsummary(list, output = "latex", stars = c('+' = .1, '*' = .05, '**' = .01, '***' = .001),
              title = title, escape = FALSE) |>
theme_tt("resize") |>
save_tt(paste0("../2.Output/", new_cate_name, ".tex"), overwrite = TRUE)
}
save_model_summaries(MS_list, "DML_PK_vs_NonPK_log")

(2) Y

total_cost_amt_result = run_dml_plr_models(df_with_dummies, Y = "total_cost_amt", D = "is_pk_live", Xs = features_base)
## INFO  [15:38:36.068] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:38:37.140] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:38:38.263] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:38:39.815] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:38:47.297] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:38:57.424] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:39:07.897] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:39:27.954] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:39:47.909] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:40:04.097] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:40:22.116] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:40:43.251] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:41:04.995] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:41:05.538] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:41:05.823] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:41:06.343] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:41:06.898] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:41:07.553] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:41:08.923] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:41:11.251] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:41:13.745] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:41:16.556] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:41:19.613] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:41:22.711] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
avg_valid_play_duration_result = run_dml_plr_models(df_with_dummies, Y = "avg_valid_play_duration", D = "is_pk_live", Xs = features_base)
## INFO  [15:41:26.822] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:41:28.100] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:41:29.684] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:41:31.210] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:41:41.008] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:41:50.778] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:42:01.701] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:42:29.556] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:42:59.033] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:43:27.493] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:43:48.564] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:44:10.056] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:44:30.548] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:44:30.833] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:44:31.136] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:44:31.645] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:44:32.159] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:44:32.645] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:44:33.799] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:44:35.993] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:44:38.191] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:44:40.564] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:44:42.897] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:44:45.278] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
follow_author_cnt_result = run_dml_plr_models(df_with_dummies, Y = "follow_author_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [15:44:48.505] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:44:49.746] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:44:50.759] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:44:51.884] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:44:59.206] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:45:06.484] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:45:14.403] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:45:28.597] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:45:42.935] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:45:58.575] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:46:13.679] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:46:28.808] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:46:44.770] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:46:45.024] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:46:45.239] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:46:45.668] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:46:46.113] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:46:46.563] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:46:47.629] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:46:49.577] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:46:51.542] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:46:53.694] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:46:56.062] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:46:58.447] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
cancel_follow_author_cnt_result = run_dml_plr_models(df_with_dummies, Y = "cancel_follow_author_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [15:47:01.733] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:47:02.877] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:47:04.130] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:47:05.517] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:47:12.742] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:47:20.338] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:47:28.426] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:47:45.120] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:47:59.733] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:48:19.862] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:48:40.639] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:49:00.900] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:49:22.180] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:49:22.502] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:49:22.815] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:49:23.483] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:49:24.030] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:49:24.635] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:49:26.034] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:49:28.488] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:49:30.973] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:49:33.521] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:49:36.966] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:49:40.074] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
follow_user_cnt_result = run_dml_plr_models(df_with_dummies, Y = "follow_user_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [15:49:44.283] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:49:45.664] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:49:47.270] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:49:48.731] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:49:58.342] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:50:07.358] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:50:16.159] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:50:33.706] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:50:49.576] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:51:09.850] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:51:30.352] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:51:54.470] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:52:17.671] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:52:17.896] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:52:18.142] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:52:19.023] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:52:19.564] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:52:20.098] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:52:21.543] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:52:23.811] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:52:26.149] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:52:28.637] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:52:31.357] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:52:34.077] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
join_fans_group_cnt_result = run_dml_plr_models(df_with_dummies, Y = "join_fans_group_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [15:52:37.846] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:52:39.070] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:52:40.285] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:52:41.715] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:52:50.141] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:52:58.561] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:53:07.862] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:53:25.336] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:53:42.959] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:54:01.860] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:54:19.796] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:54:38.493] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:54:59.470] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:54:59.777] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:54:59.980] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:55:00.421] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:55:01.211] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:55:01.805] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:55:03.085] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:55:05.271] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:55:07.317] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:55:09.559] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:55:12.267] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:55:14.946] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
category <- c("total_cost_amt", "avg_valid_play_duration", "follow_author_cnt", 
              "cancel_follow_author_cnt", "follow_user_cnt", "join_fans_group_cnt")
crs <- c(
  "total_cost_amt" = "Total Gifting",
  "avg_valid_play_duration" = "Avg Play Duration Per Viewer",
  "follow_author_cnt" = "New Followers",
  "cancel_follow_author_cnt" = "Lost Followers",
  "follow_user_cnt" = "Viewer-to-Viewer Follows",
  "join_fans_group_cnt" = "New Loyal Fans (log)"
)

MS_list <- list()
for (var in category) {
  new_var <- crs[[var]]
  MS_list[[new_var]] <- get(paste0(var, "_result"))[['mod']]
  
    
  ggsave(paste0("../2.Output/DML_PK_vs_NonPK_", var, ".pdf"), plot = get(paste0(var, "_result"))[['plot']], device = "pdf", width = 16, height = 9, units = "in")
  ggsave(paste0("../2.Output/DML_PK_vs_NonPK_", var, ".png"), plot = get(paste0(var, "_result"))[['plot']], device = "png", width = 16, height = 9, dpi = 300, units = "in")
}
modelsummary(MS_list)
Total Gifting Avg Play Duration Per Viewer New Followers Lost Followers Viewer-to-Viewer Follows New Loyal Fans (log)
LASSO 323.849 -2728.283 2.906 -0.372 6.476 -0.223
(111.513) (1145.574) (5.080) (1.983) (5.423) (0.744)
Random Forest 353.885 -1662.194 10.554 2.578 7.180 -0.267
(117.846) (935.584) (4.162) (1.072) (2.109) (0.581)
Regression Tree 492.668 -4386.058 14.129 4.284 14.240 0.744
(81.086) (1030.656) (5.259) (1.614) (4.176) (0.471)
Boosted Trees 388.426 282.521 9.194 2.341 6.064 -0.017
(85.170) (905.989) (3.598) (1.029) (2.365) (0.539)
Obs 196684 196684 196684 196684 196684 196684
save_model_summaries <- function(list, new_cate_name) {
modelsummary(list, stars = c('+' = .1, '*' = .05, '**' = .01, '***' = .001), 
             output = paste0("../2.Output/", new_cate_name, ".docx"))

title = paste0('The Impact of PK Event',
                            '\\label{tab:', new_cate_name, '}')

modelsummary(list, output = "latex", stars = c('+' = .1, '*' = .05, '**' = .01, '***' = .001),
              title = title, escape = FALSE) |>
theme_tt("resize") |>
save_tt(paste0("../2.Output/", new_cate_name, ".tex"), overwrite = TRUE)
}
save_model_summaries(MS_list, "DML_PK_vs_NonPK")

(3) log(0.01+x)

log001_total_cost_amt_result = run_dml_plr_models(df_with_dummies, Y = "log001_total_cost_amt", D = "is_pk_live", Xs = features_base)
## INFO  [15:55:22.070] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:55:23.363] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:55:24.781] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:55:26.690] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:55:35.396] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:55:43.178] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:55:52.011] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:56:14.140] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:56:36.155] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:56:58.061] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:57:13.423] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [15:57:28.909] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [15:57:44.900] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [15:57:45.193] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [15:57:45.492] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [15:57:45.992] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [15:57:46.459] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [15:57:46.910] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [15:57:47.997] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [15:57:50.299] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [15:57:52.601] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [15:57:54.995] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [15:57:57.364] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [15:57:59.768] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log001_avg_valid_play_duration_result = run_dml_plr_models(df_with_dummies, Y = "log001_avg_valid_play_duration", D = "is_pk_live", Xs = features_base)
## INFO  [15:58:02.994] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [15:58:04.154] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [15:58:05.442] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [15:58:06.612] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [15:58:13.863] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [15:58:20.991] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [15:58:29.165] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [15:58:54.078] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [15:59:15.422] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [15:59:37.415] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [15:59:54.234] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [16:00:11.101] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [16:00:28.913] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [16:00:29.297] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [16:00:29.620] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [16:00:30.436] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [16:00:30.863] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [16:00:31.345] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [16:00:32.450] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [16:00:34.717] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [16:00:36.996] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [16:00:39.431] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [16:00:41.967] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [16:00:44.416] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log001_follow_author_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log001_follow_author_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [16:00:47.713] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [16:00:48.860] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [16:00:50.165] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [16:00:51.423] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [16:00:58.926] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [16:01:06.118] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [16:01:14.212] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [16:01:35.484] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [16:01:55.937] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [16:02:16.388] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [16:02:31.418] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [16:02:46.970] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [16:03:03.384] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [16:03:03.724] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [16:03:03.993] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [16:03:04.492] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [16:03:04.939] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [16:03:05.389] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [16:03:06.781] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [16:03:09.037] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [16:03:11.276] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [16:03:13.644] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [16:03:15.995] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [16:03:18.345] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log001_cancel_follow_author_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log001_cancel_follow_author_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [16:03:21.552] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [16:03:22.604] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [16:03:23.887] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [16:03:25.308] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [16:03:32.336] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [16:03:39.633] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [16:03:47.450] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [16:04:07.701] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [16:04:29.566] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [16:04:50.988] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [16:05:08.166] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [16:05:28.447] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [16:05:46.135] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [16:05:46.415] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [16:05:46.705] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [16:05:47.353] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [16:05:47.792] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [16:05:48.289] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [16:05:49.533] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [16:05:52.002] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [16:05:54.365] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [16:05:56.866] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [16:05:59.432] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [16:06:01.925] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log001_follow_user_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log001_follow_user_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [16:06:05.516] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [16:06:06.969] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [16:06:08.265] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [16:06:10.333] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [16:06:18.547] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [16:06:26.173] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [16:06:34.727] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [16:06:54.378] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [16:07:13.748] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [16:07:33.458] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [16:07:49.997] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [16:08:05.286] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [16:08:22.038] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [16:08:22.328] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [16:08:22.627] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [16:08:23.139] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [16:08:23.624] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [16:08:24.064] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [16:08:25.145] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [16:08:27.298] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [16:08:29.451] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [16:08:31.722] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [16:08:34.104] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [16:08:36.460] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
log001_join_fans_group_cnt_result = run_dml_plr_models(df_with_dummies, Y = "log001_join_fans_group_cnt", D = "is_pk_live", Xs = features_base)
## INFO  [16:08:39.722] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 1/3)
## INFO  [16:08:40.795] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 2/3)
## INFO  [16:08:42.094] [mlr3] Applying learner 'regr.cv_glmnet' on task 'nuis_l' (iter 3/3)
## INFO  [16:08:43.443] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 1/3)
## INFO  [16:08:50.791] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 2/3)
## INFO  [16:08:58.255] [mlr3] Applying learner 'classif.cv_glmnet' on task 'nuis_m' (iter 3/3)
## INFO  [16:09:06.937] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 1/3)
## INFO  [16:09:25.784] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 2/3)
## INFO  [16:09:44.455] [mlr3] Applying learner 'regr.ranger' on task 'nuis_l' (iter 3/3)
## INFO  [16:10:02.680] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 1/3)
## INFO  [16:10:17.777] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 2/3)
## INFO  [16:10:33.002] [mlr3] Applying learner 'classif.ranger' on task 'nuis_m' (iter 3/3)
## INFO  [16:10:49.744] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 1/3)
## INFO  [16:10:50.034] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 2/3)
## INFO  [16:10:50.320] [mlr3] Applying learner 'regr.rpart' on task 'nuis_l' (iter 3/3)
## INFO  [16:10:50.828] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 1/3)
## INFO  [16:10:51.311] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 2/3)
## INFO  [16:10:51.751] [mlr3] Applying learner 'classif.rpart' on task 'nuis_m' (iter 3/3)
## INFO  [16:10:52.849] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 1/3)
## INFO  [16:10:54.957] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 2/3)
## INFO  [16:10:57.033] [mlr3] Applying learner 'regr.xgboost' on task 'nuis_l' (iter 3/3)
## INFO  [16:10:59.258] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 1/3)
## INFO  [16:11:01.648] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 2/3)
## INFO  [16:11:03.999] [mlr3] Applying learner 'classif.xgboost' on task 'nuis_m' (iter 3/3)
category <- c("log001_total_cost_amt", "log001_avg_valid_play_duration", "log001_follow_author_cnt", 
              "log001_cancel_follow_author_cnt", "log001_follow_user_cnt", "log001_join_fans_group_cnt")
crs <- c(
  "log001_total_cost_amt" = "Total Gifting (log001)",
  "log001_avg_valid_play_duration" = "Avg Play Duration Per Viewer (log001)",
  "log001_follow_author_cnt" = "New Followers (log001)",
  "log001_cancel_follow_author_cnt" = "Lost Followers (log001)",
  "log001_follow_user_cnt" = "Viewer-to-Viewer Follows (log001)",
  "log001_join_fans_group_cnt" = "New Fans (log001)"
)

MS_list <- list()
for (var in category) {
  new_var <- crs[[var]]
  MS_list[[new_var]] <- get(paste0(var, "_result"))[['mod']]
  
    
  ggsave(paste0("../2.Output/DML_PK_vs_NonPK_", var, ".pdf"), plot = get(paste0(var, "_result"))[['plot']], device = "pdf", width = 16, height = 9, units = "in")
  ggsave(paste0("../2.Output/DML_PK_vs_NonPK_", var, ".png"), plot = get(paste0(var, "_result"))[['plot']], device = "png", width = 16, height = 9, dpi = 300, units = "in")
}
save_model_summaries <- function(list, new_cate_name) {
modelsummary(list, stars = c('+' = .1, '*' = .05, '**' = .01, '***' = .001), 
             output = paste0("../2.Output/", new_cate_name, ".docx"))

title = paste0('The Impact of PK Event',
                            '\\label{tab:', new_cate_name, '}')

modelsummary(list, output = "latex", stars = c('+' = .1, '*' = .05, '**' = .01, '***' = .001),
              title = title, escape = FALSE) |>
theme_tt("resize") |>
save_tt(paste0("../2.Output/", new_cate_name, ".tex"), overwrite = TRUE)
}
save_model_summaries(MS_list, "DML_PK_vs_NonPK_log001")