CQI365

這週末在醫學會給了一場醫療品質的演講,其中我整理了一些品質改善的一個歷程。對於一個醫療專業人員,我們要從Do the Right thing Right開始,延伸到針對「對」的病人把對的事作對!

但是到團隊的階層,我們要能橫向擴展到把「對的事」延伸到「所有對的病人」,甚至到把針對這些病人族群,把「所有的對的事都作對」。更進一步,要讓團隊所有人能達到上述的品質,才能真正達到醫療品質的提升。

沒有最好只有更好,因此我們面對醫療品質,我們應該要讓「所有人」對「所有對」病人,把所有對的事作對!

Originally published at https://blog.cqi365.info.

要在Markdown使用mermaid其實很簡單,只有你的編輯器能夠支援即可!我目前使用的Devonthink,只要在preference中開啟支援選項,就可以直接啟動。

使用方式也非常簡單,直接在markdown文中使用「```mermaid」的方式來引用與包圍語法。

舉例來說下面的語法:

flowchart LR subgraph one id1[This is the text in the box] → B[Diamond]
id1 ← two way arrow →F[(Database)]
end
subgraph two
B → C([c1]) -.-> D
B → D[d2] -.-> F
end
```

可以呈現出下列效果:

附上連結可以讓我們快速查閱流程圖的作法。 mermaid — Markdownish syntax for generating flowcharts, sequence diagrams, class diagrams, gantt charts and git graphs.

Markdown格式支持的功能越來越強悍,因此在大部分的場景真得不需要打開Word來處理,做筆記或者簡短文字都可以透過Markdown來處理。現在加上這個功能真得是可以強大的利用markdown處理幾乎80%以上文字處理了!

Originally published at https://blog.cqi365.info.

身為一個資深的網路用戶,曾經見證過Yahoo盛極一時的年代,也一路從Google還小的時候一路相挺至今。

但是近幾年來,在google 撲天蓋地的『個人化搜尋』的植入下,大家應該跟我一樣有一種被滲透的感覺。你有曾經在手機網頁搜尋某個主題,然後在臉書、家中電腦被撲天蓋地類似的主題洗版嗎?

這種個人化的方便性雖然某些程度對我們很方便,但是卻是犧牲我們個人隱私來創造的。因此近幾年許多強調隱私的網路搜尋服務,逐漸嶄露頭角!其中一個最成熟的就是這個名稱可愛但是搜尋能力不輸google的「鴨鴨走」
DuckDuckGo — 保有隱私,可以很簡單。

  1. 直接搜尋:不管你用哪一個瀏覽器,或者是否用自己的電腦。直接用Google 搜尋DuckDuckGo後,可以連結到DuckDuckGO的搜尋網頁。在搜尋框可以直接搜尋就可以了!
  2. 修改瀏覽器預設:若在自己的電腦或手機,可以透過修改瀏覽器的預設搜尋引擎。

以window 的Edge為例,點選「設定」中的隱私權與搜尋,拉到最下方的服務部分,可以看到「搜尋列搜尋」,在進一步點選進去選單。

你是否在在搜尋研究主題或者文獻收集時,在各種研究平台跳轉來去?是否不斷的在搜尋條件中來回徘徊?這個由Devontechnology 開發的強大搜尋工具DevonAgents可以幫點忙。過去我主要搜尋醫療的文獻,因此主要在Google scholar與Pubmed中遊走。最近因為接觸資訊領域的文章,常常需要跨領域的搜尋。Google scholar與PubMed找到的文章內容就顯的侷限。因此開始廣泛使用DevonAgents來進行我的研究的第一步:Literacture Review。

下面簡單介紹ㄧ下,我目前怎麼使用DevonAgents,以及如何與Devonthink搭配呢?

DevonAgent 主要特色:

  • 可以準確搜尋,類似google的一些搜尋語法。
  • 可以搜尋Devonthink資料庫
  • 可以在同一介面搜尋不同資料庫(如Pubmed, Google. Googleschoar等)
  • 可以快速貯存搜尋條件(包含所搜尋的keywords以及目標資料庫)
  • 可以快速將摘要或內容轉存到Devonthink。
  • 與Devonthink相同強大的See Also

使用場景context:

  • 搜尋醫療專業,使用pubmed。
  • 搜尋關鍵字後,在DevonAgent中快速瀏覽。
  • 固定定時搜尋,存檔後可以定時搜尋,快速更新。

非使用場景:簡單的搜尋一個特定產品或網站。這時候簡單開啟google就可以了!

使用流程workflow:

  • 根據要找的關鍵字,使用Devonagents 搜尋。

#統計 #GEE #Python
#Statsmodel

前言

Logit GEE

如果目標變數是binary ,則可以透過下列程式碼處理:

fam = sm.families.Binomial()
ind = sm.cov_struct.Exchangeable()
mod=smf.gee(formula=formila, groups='hmpcrtno',time="datetime", data=df_dataset, cov_struct=ind, family=fam)
res = mod.fit()
res.summary2()

OLS GEE

如果目標變數是continuous data ,則可以透過下列程式碼處理:

fam = sm.families.Poisson()
ind = sm.cov_struct.Exchangeable()
mod= smf.gee(formula=groups='hmpcrtno',time="datetime", data=df_dataset, cov_struct=ind, family=fam) res = mod.fit()
res.summary2()
  • GEE 架構除了regression的formula外,在statsmodel還有幾個重點:
  1. cov_struct: 變數之間得結構,是否有內在相關。如果是個別獨立可以用independent,但是大部分都是合用exchangeable.
  2. family :根據使用的類別來使用,Logit 這類二元分類,就要用binominal,線性可以使用Gaussian,其他比率問文可以使用Poison

延伸閱讀:

#2021, #20210710, #Devonthink #Youtube #ZettelKasten

剛剛在Matters 中看到這篇文章:Obsidian x Youtube take notes 用 obsidian 做 Youtube 筆記獲益良多。 直接在筆記軟體中邊聽邊看邊做筆記,可以有效率的建立筆記。避免聽完看完轉頭就忘的窘境。因此我這邊也來根據這個思路,使用我的筆記軟體Devonthink來進行類似的流程,提供給大家參考。

方法一:將YouTube 嵌入markdown筆記

  • 在Youtube 中選擇分享,並選擇嵌入模式。
  • 再嵌入模式複製嵌入的程式碼。

#PropensityScoreMatch #Python #Statistics

最近開始整理之前的研究檔案,其中一個retrospective cohort study所收集到的實驗與對照組人數落差太大,對照組是試驗組的10倍以上。為了減少研究的落差,可以採用Propensity score matching的方式。

以下有兩個方法透過python來處理:

## method1:

參考:matched pairs in Python (Propensity score matching)

### code:

from sklearn.preprocessing import StandardScalerfrom sklearn.neighbors import NearestNeighbors

def get_matching_pairs(treated_df, non_treated_df, scaler=True):
treated_x = treated_df.values
non_treated_x = non_treated_df.values
if scaler == True:
scaler = StandardScaler()
if scaler:
scaler.fit(treated_x)
treated_x = scaler.transform(treated_x)
non_treated_x = scaler.transform(non_treated_x)
nbrs= NearestNeighbors(n_neighbors=1,algorithm=’ball_tree’).fit(non_treated_x)
distances, indices = nbrs.kneighbors(treated_x)
indices = indices.reshape(indices.shape[0])
matched = non_treated_df.iloc[indices]
return matched
matched_df = get_matching_pairs(treated_df, non_treated_df)
Python code

### 說明與思考

這段程式碼使用sklearn的scalar先把數值標準化,在透過NearestNeighbors的方式,找到最接近的個案!可以直接拿來產出兩組,在進行後面的研究流程。

## method 2

參考:heart-propensity-score-matching.pdf

# python 
model = ‘treated ~ age + male +edu’ propensity = smf.logit(formula=model, data = df).fit() propensity.summary()

### 思考

1. 這個方式,透過logit regression,產出一個針對’group’的預測數值。
2. 可以直接這個數值當作一個控制變因來使用!

這幾個月公司每天都要上線填體溫與TOCC,但實際上每天關在家中哪裡都沒去,每天的TOCC都一樣。體溫基本上也都在正常範圍。為了不要每天填寫TOCC,因此我寫了一個script來Automate整個填寫過程。真的可以說,懶惰是進步的動力。

## 主要工具:Selenium。
Selenium 主要透過模擬瀏覽器,來完成一些網頁操作的任務。因此很適合操作性的網頁自動化。相對比爬蟲是在做抓取資料以提供後續分析,兩者不太一樣!

### code:

from selenium import webdriver
import random
from datetime import datetime
year = datetime.now().year
month = datetime.now().month
day = datetime.now().day
driver = webdriver.Edge(‘C:/WebDriver/bin/msedgedriver’)
driver.get(‘https://docs.google.com/…’)
date_check = driver.find_elements_by_xpath(“//div[contains(@class,’quantumWizTextinputPaperinputContentArea exportContentArea’)]//input”)[0]
date_check.send_keys(year, month, day)
position_Check = driver.find_element_by_xpath(“//div[@class=’appsMaterialWizToggleRadiogroupEl exportToggleEl’ and @id=’i12']”)
position_Check.click()
code_check = driver.find_elements_by_xpath(“//div[contains(@class,’quantumWizTextinputPaperinputContentArea exportContentArea’)]//input”)[1]
code_check.send_keys(‘XXXXX’)
name_check = driver.find_elements_by_xpath(“//div[contains(@class,’quantumWizTextinputPaperinputContentArea exportContentArea’)]//input”)[2]
name_check.send_keys(‘XXX’)
travel_Check = driver.find_element_by_xpath(
“//div[@class=’appsMaterialWizToggleRadiogroupEl exportToggleEl’ and @id=’i51']”)
travel_Check.click()
contact_Check = driver.find_element_by_xpath(“//div[@class=’appsMaterialWizToggleRadiogroupEl exportToggleEl’ and @id=’i65']”)
contact_Check.click()
temeprature = str(round(random.uniform(35.8, 37), 1))
temperature_check = driver.find_elements_by_xpath(“//div[contains(@class,’quantumWizTextinputPaperinputContentArea exportContentArea’)]//input”)[5]
temperature_check.send_keys(temeprature)
submit = driver.find_elements_by_xpath(“//div[@role=’button’]”)[0]
submit.click()
driver.close()

## 封裝與自動化

最後將上述得程式封裝成exe檔,並透過window安排自動化排定執行時間。這樣就搞定了繁瑣的TOCC。

之前寫過幾篇有關obsidian, typora and Devonthink 的文章:

  1. | CQI365 | 林軒名醫師 | 等待雨果 |: 整合HighlightsApp + Obsidian,建立效率的整合閱讀與標記流程
  2. | CQI365 | 林軒名醫師 | 等待雨果 |: 建立zettleKasten 筆記:Devonthink or Obsidian ?
  3. | CQI365 | 林軒名醫師 | 等待雨果 |: 使用Devonthink3.7取代Obsidian做筆記
  4. | CQI365 | 林軒名醫師 | 等待雨果 |: Typora 有禪味的Markdown編輯器

那幾個月不斷的組合自己的markdown工作平台,後來也用了一陣子Obsidian,但是最後還是回到單純Devonthink的介面。其實Obsidian的wiki-link 真的很強悍,更動檔名的時候他也會自動幫你更新其他文件內相對應的檔名。加上強悍的連結地圖的功能,其實真的很強大的寫作與筆記軟體。但是基於幾個在我的使用流程的缺點,我還是放棄使用obsidian。

幾個問題

  1. Wikilink :Wiki link 可以說是obsidain的強項,他可以根據建立的wiki link 自動搜尋連結當對應的筆記,起建立連結地圖與反向連結。但是也有一個致命的缺陷,如果你在非obsidian系統架構下,做檔案「檔名更動」,那obsidian就無法偵測到檔名的變動,wiki link就會斷開!我以devonthink為主力系統下,在devonthink更動名稱是很常見的作法,這樣一來就會讓一推wiki link 常常在失效。失效後,一定得要手動才能修復,這時在造成我莫大的困擾。
  2. 無法預覽其他文件檔:這一點是相對devonthink而言的,因為devonthink可以預覽幾乎大部分的文件檔案,因此在devonthink中遊走略覽是非常方便的。但是在devonthink中一定要打開第三方軟體,才能閱覽到許多文件檔,這樣整個流程都被打亂了!雖然後續obsidain更新版後,可以支援PDF閱讀,不過我的文件種類繁多,還是需要其他閱覽氣得支援。
  3. 資料整理功能薄弱:這也是相對devonthink來說,整體的obsidian主要功能就不是整理,因此整理的功能相對devonthink不在同一個檔次。因此我就被迫要在devonthink處理大部分的工作,然後回到IObsidain寫作,這樣真的沒有節省到時間。
  4. 龐大:如果摒除wikilink與他強大的連結地圖,身為一個單純的markdown編輯器,Obsidan又過於龐大。因此如果要單純找一個markdown編輯器,其實我們更好的選擇可以搭配Devonthink。

最終組合:

  1. 資料庫整理:回到devonthink。 資料庫一向是Devonthink的優勢,他強大的整理能力,加上item link的連結模式,可以建立自強大的KM,不需要在藉助其他的軟體或服務。
  2. 編輯器:回到Typora。雖然Devonthin更新到3.7,其Markdown編輯器可用性高很多。| CQI365 | 林軒名醫師 | 等待雨果 |: 使用Devonthink3.7取代Obsidian做筆記。但是連續使用一兩個月後,我還是無法接受那個故於簡陋的介面。因此回到Typora當我的MD編輯器,Devonthink則是扮演資料庫與整理的角色。兩個軟體的特性迥然不同,搭配與互補的很好。

要適應的問題:

  1. 針對wiki link 問題:不使用Obsidian,就不太能使用那個強悍的Wiki link。雖然Devonthink也有wiki link,但是相較obsidan還是功能差太多。因此我直接回到devonthink使用item link。這樣一來除了可以在MAc 上使用,也可以在手機版本的DTG使用,也省去了更改檔名造成連結喪失的問題。
  2. 沒有graph:其實那個 fancy的圖,只能連接Markdown格式的文件,對我這種PDF, word, PPT一堆的工作者,真的也什麼用處。
  3. 介面問題:透過美麗的Typora,介面就不是問題了!

Originally published at https://matters.news on June 16, 2021.