Skip to content

Commit

Permalink
d
Browse files Browse the repository at this point in the history
  • Loading branch information
jinseob2kim committed Jan 5, 2025
1 parent 440f9f8 commit 8b74c72
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 552 deletions.
371 changes: 65 additions & 306 deletions docs/KSIC2025/index.html

Large diffs are not rendered by default.

300 changes: 54 additions & 246 deletions docs/KSIC2025/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -397,315 +397,123 @@ design.lalonde <- svydesign(ids=~1, strata=NULL, weights=~wt, data = lalonde)
jstable::svyCreateTableOneJS(vars = names(m.out$X), strata = "treat", data = design.lalonde, smd = T)$table %>% kable
```

## openstat.ai




## 3그룹 A vs B vs C

Matching: N수 제일 작은 그룹(A) 에 맞춰 여러번 매칭

- `MatchIt` 그대로 쓸 수 있는건 장점
- $ATT$도 아닌 $ATT_{A}$?


IPTW: `twang::mnps`

- 시간이 오래걸림: 공단데이터에서 24시간 걸릴수도
- $ATE$ 가능, 더 추천


## Issue 1: Matching 후 pair정보 이용


## Issue 2: Sex를 그룹변수로 Matching 가능?


## Executive summary

**Baseline 맞춘다(X), RCT를 모방한다(O)**

- ATE(average treatment effect) vs ATT(average treatment effect on treated)

- Matching은 ATT, IPTW는 ATE

**2그룹 `MatchIt`, 3그룹 `twang` 패키지**

- Logistic regression, Nearest neighbor, caliper 이해

- 3그룹 matching은 가장 작은 N수에 맞춰 2번 수행

- openstat.ai 에서 2그룹 matching/IPTW 지원


**분석 이슈**

- Matching 후 pair정보 이용해야 하는가?(ex: stratified cox)

- 성별에 따라 매칭/IPTW 해도 되는가?






## 日本ブログレビュー
## openstat.ai

::: columns
::: {.column width="50%"}
![](jskm_japan.png)
![](openstat.png)
![](mat.png)
:::

::: {.column width="50%"}
![](jskm_japan2.png)
![](tb1.png)
![](km.png)
:::
:::

Survey data, Landmark, Competing risk analysis support

::: notes
特に日本の研究者の方がランドマーク分析機能をたくさん利用してくださって、ブログレビューがたくさんあります。 토쿠니 니혼노 켄큐우샤노 호오가 란도마아쿠분세키키노오오 타쿠산 리요오시테쿠다삿테 부로구레뷰우가 타쿠산 아리마스
:::

##

<center><a href="https://github.com/jinseob2kim/jstable"><img src="jstable.png" width="100%"/></a></center>

::: columns
::: {.column width="50%"}
``` r
## Gaussian
glm_gaussian <- glm(mpg~cyl + disp, data = mtcars)
glmshow.display(glm_gaussian, decimal = 2)
```
## 3그룹 A vs B vs C

``` r
$first.line
[1] "Linear regression predicting mpg\n"
Matching: N수 제일 작은 그룹(A) 에 맞춰 여러번 매칭

$table
crude coeff.(95%CI) crude P value adj. coeff.(95%CI) adj. P value
cyl "-2.88 (-3.51,-2.24)" "< 0.001" "-1.59 (-2.98,-0.19)" "0.034"
disp "-0.04 (-0.05,-0.03)" "< 0.001" "-0.02 (-0.04,0)" "0.054"
- `MatchIt` 그대로 쓸 수 있는건 장점
- $ATT$도 아닌 $ATT_{A}$?

$last.lines
[1] "No. of observations = 32\nR-squared = 0.7596\nAIC value = 167.1456\n\n"
```
:::

::: {.column width="50%"}
``` r
## Binomial
glm_binomial <- glm(vs~cyl + disp, data = mtcars, family = binomial)
glmshow.display(glm_binomial, decimal = 2)
```
IPTW: `twang::mnps`

``` r
$first.line
[1] "Logistic regression predicting vs\n"

$table
crude OR.(95%CI) crude P value adj. OR.(95%CI) adj. P value
cyl "0.2 (0.08,0.56)" "0.002" "0.15 (0.02,1.02)" "0.053"
disp "0.98 (0.97,0.99)" "0.002" "1 (0.98,1.03)" "0.715"

$last.lines
[1] "No. of observations = 32\nAIC value = 23.8304\n\n"
```
:::
:::
- 시간이 오래걸림: 공단데이터에서 24시간 걸릴수도
- $ATE$ 가능, 더 추천

## Subgroup analysis

``` r
TableSubgroupMultiGLM(status ~ sex, var_subgroups = c("kk", "kk1"), data = lung, family = "binomial")
```
## Issue 1: Matching 후 pair정보 이용

``` r
Variable Count Percent OR Lower Upper P value P for interaction
sex2 Overall 228 100 3.01 1.65 5.47 <0.001 <NA>
1 kk <NA> <NA> <NA> <NA> <NA> <NA> 0.476
2 0 38 16.9 7 0.7 70.03 0.098 <NA>
3 1 187 83.1 2.94 1.55 5.57 0.001 <NA>
4 kk1 <NA> <NA> <NA> <NA> <NA> <NA> 0.984
5 0 8 3.6 314366015.19 0 Inf 0.997 <NA>
6 1 217 96.4 2.85 1.55 5.25 0.001 <NA>
```
Matching 후 stratified cox를 해야하는가? Yes or No

``` r
TableSubgroupMultiCox(Surv(time, status) ~ sex, var_subgroups = c("kk", "kk1"), data = lung)
```
```{r, echo= T, eval=F}
cox1 <- coxph(Surv(time, status) ~ treat, data = mdata)
``` r
Variable Count Percent Point Estimate Lower Upper sex=1 sex=2 P value P for interaction
sex Overall 228 100 1.91 1.14 3.2 100 100 0.014 <NA>
1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
2 kk <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 0.525
3 0 38 16.9 2.88 0.31 26.49 10 100 0.35 <NA>
4 1 187 83.1 1.84 1.08 3.14 100 100 0.026 <NA>
5 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
6 kk1 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 0.997
7 0 8 3.6 <NA> <NA> <NA> 0 100 <NA> <NA>
8 1 217 96.4 1.88 1.12 3.17 100 100 0.018 <NA>
cox2 <- coxph(Surv(time, status) ~ treat + strata(subclass), data = mdata)
```

## 中国での動画やブログレビュー

::: columns
::: {.column width="50%"}
![](jstable_ch.png)
:::

::: {.column width="50%"}
![](jstable_ch2.png)
:::
:::

##

<center><a href="https://github.com/jinseob2kim/jsmodule"><img src="jsmodule.png" width="100%"/></a></center>
</br>

::: columns
::: {.column width="50%"}
![](https://github.com/jinseob2kim/jsmodule/blob/master/vignettes/figures/ps.png?raw=true)
:::
**Pair 마다 baseline hazard가 다르다는 가정**

::: {.column width="50%"}
1\~2行のコードだけで分析ウェブを作れるよう、各分析機能をmoduleとして開発
- RCT 재현 관점: 필요없음(pair정보 없음)

![](jsmodule2.png)
:::
:::

::: notes
마지막으로 jsmodule입니다. jskm, jstable 내용을 포함해 의학통계에서 많이 이용되는 분석기능들을 Shiny module로 만들고, 이 모듈들을 모아 로컬에서 실행할 수 있는 Shiny App 을 만들었습니다. Shiny App은 총 5종류로 일반데이터용, Survey data용, GEE를 적용한 반복측정데이터용, 마지막으로 인과추론 분석방법인 Propensity score mathching과 IPTW 를 수행할 수 있는 Shiny App 입니다. 각 분석기능은 독립적으로 Shiny module로 개발되었으므로, 누구나 자신의 Shiny app에 적용할 수 있습니다.
:::
- 매칭이 너무 잘 되어서 pair정보가 확실하다면?

##
- Pair 들끼리 뭔가 다르다면?

![](그림1.png)
- OMOP-CDM ATLAS에서는 strata 사용하는게 Default.

::: notes
이것은 jskm을 Shiny module로 만든 것이며, 그림은 PPT로 다운받아 직접 편집할 수 있습니다. officer과 rvg 패키지를 이용했습니다.
:::

## 論文支援実績
## 번외: baseline hazard 보정방법

SCI論文200編以上サポート
예) 다기관 RCT에서 hospital, stratified random

- 医学分野 トップジャーナル NEJM、LANCET、JAMAを含む
- 6つの大学病院と年単位研究支援契約、10ヶ所の製薬会社の臨床試験分析をサポート
```{r, echo=T, eval=F}
cox1 <- coxph(Surv(time, status) ~ treat + strata(hospital), data = mdata)
![](그림2.png)

::: notes
저희 회사에서는 이 패키지들을 이용해 의학연구를 지원하고 있으며, 세계 3대 의학저널인 NEJM, LANCET, JAMA 포함 200편 이상의 SCI 논문에 필요한 분석을 지원하였습니다. 한국의 6개 대학병원과 연단위 계약을 수행중이며, 10개이상 제약회사의 임상시험 데이터분석을 지원중입니다.
:::

## 無料統計ウェブ

- よく利用される分析機能を無料で分析できるopenstat.ai 公開
- jskm/jstable/jsmoduleの分析moduleを適用

::: columns
::: {.column width="70%"}
[**openstat.ai**](https://openstat.ai/)**: free**

![](example-meta.png)
:::
cox2 <- coxph(Surv(time, status) ~ treat + hospital, data = mdata)
::: {.column width="30%"}
**Openstat QR code**
cox3 <- coxme::coxme(Surv(time, status) ~ treat + (1|hospital), data = mdata)
![](오픈스탯.png)
:::
:::

::: notes
연구자들이 R 패키지 설치없이도 웹에서 이용할 수 있도록 하기 위해 openstat.ai를 출시하였습니다. 연구자는 자신의 데이터를 업로드하여 jsmodule의 4가지 Shiny app을 이용할 수 있습니다. 메타분석, 샘플수계산을 위한 Shiny app도 이용할 수 있습니다.
:::

## 国家R&D選定

3件の国家R&D支援事業を通じて技術開発および医学研究用の高度化を遂行

\`22 (韓国)科学技術情報通信部「公開SW基盤のクラウド統計パッケージSW開発」(2年1億円)
cox4 <- coxph(Surv(time, status) ~ treat, data = mdata, cluster = hospital)
```

- 統計非専攻者及び一般向け
</br>

\`23 (韓国)情報通信産業振興院公開SW技術拡散支援事業(7ヶ月2000万円)
- `+ hospital` 도 가능, but 각 병원의 계수를 굳이 구할필요가?

- 医学研究用
- `coxme`: mixed model의 Random effect, `strata`와 비슷한 의미

\`23 (韓国)中小ベンチャー部 (1200万円)
- `cluster = hospital`: 같은 hospital 간에 상관관계가 있음을 보정하므로 `strata`와 비슷한 의미일 것 같지만, **baseline hazard 이 다르다는 가정이 아님**. `cluster` 옵션 전후 HR은 변하지 않음, SE만 변화.

- 医学研究用&臨床試験

::: notes
저희 패키지는 한국에서 3건의 R&D 지원을 받아 개발 및 의학연구/임상시험용 고도화를 수행하였습니다.
:::

## 著作権登録
## Issue 2: Sex를 그룹변수로 Matching 가능?

<center><img src="jj.png" width="50%"/></a></center>
Sex가 RCT 가능한가?

::: notes
R&D 지원을 통해 소프트웨어 저작권을 등록했으며
:::
- **불가능** vs 하늘(?) 이 준 랜덤

## オープンソース管理
Matching: $ATT$

::: columns
::: {.column width="50%"}
https://statgarten-issue.streamlit.app/
- 남자 vs 남자같은 여자, 여자 vs 여자같은 남자

![](metric.png)
:::
IPTW: $ATE$ 니까 OK?

::: {.column width="50%"}
Github action
- 전체 연구대상자(남자 + 여자) 를 남/여 1:1로 랜덤배정했다는 뜻

- テスト、ホームページアップデート、ライセンス同意、コードstyle

![](ga.png)
:::
:::

::: notes
자체 개발한 파이썬 streamlit 기반 대시보드를 이용해 깃허브 활성화 정도를 실시간으로 체크할 수 있으며, 모든 패키지는 Github action을 통해 에러체크, 홈페이지 업데이트, 코드 스타일링, 라이선스 동의가 자동으로 수행됩니다.
:::
## Executive summary

## オープンソースライセンス検証
**Baseline 맞춘다(X), RCT를 모방한다(O)**

<center><img src="license.png" width="80%"/></a></center>
- ATE(average treatment effect) vs ATT(average treatment effect on treated)

::: notes
모든 패키지는 나라에서 지원하는 오픈소스라이선스검증 프로그램을 이용해, 라이선스 문제가 없음을 검증받았습니다.
:::
- Matching은 ATT, IPTW는 ATE

## R package: Shiny -\> exe
**2그룹 `MatchIt`, 3그룹 `twang` 패키지**

R必要なくexeファイルにしてローカル環境で実行 - [executablePackeR](https://github.com/ChangwooLim/executablePackeR)
- Logistic regression, Nearest neighbor, caliper 이해

<center><a href="https://www.r-bloggers.com/2023/03/creating-standalone-apps-from-shiny-with-electron-2023-macos-m1//"><img src="スクリーンショット 2024-04-17 午後12.02.26.png" width="50%"/></a></center>
- 3그룹 matching은 가장 작은 N수에 맞춰 2번 수행

::: notes
폐쇄 인터넷망 및 R패키지 설치가 어려운 병원들을 위해, Shiny app을 exe파일로 만들어주는 R패키지를 만들어 크랜에 공개하였습니다. 이 패키지를 이용하면 exe 파일의 실행만으로 shiny app을 이용할 수 있으며, 알블로거에도 소개되었습니다.
:::
- openstat.ai 에서 2그룹 matching/IPTW 지원

## 要約

- 医学研究用Rパッケージの開発、日本/中国で活用
**분석 이슈**

- 国家R&D選定
- Matching 후 pair정보 이용해야 하는가?(ex: stratified cox)

- 最新オープンソース管理技術
- 성별에 따라 매칭/IPTW 해도 되는가?

- ライセンス検証

# ご清聴、ありがとうございました。

::: notes
ご清聴(せいちょう)ありがとうございました。
:::
# 감사합니다.
Binary file added docs/KSIC2025/km.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/KSIC2025/mat.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/KSIC2025/openstat.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/KSIC2025/tb1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 8b74c72

Please sign in to comment.