Category: R

ดูการกระจายข่าวใน FB

นักการตลาดท่านหนึ่งอยากรู้ว่าข่าวประชาสัมพันธ์ที่ท่านช่วยอยู่มีการแชร์อย่างไรใน FB ผมเลยช่วยทำให้ดูแบบง่ายๆแต่ท่านต้องหาคนมาช่วยเก็บข้อมูลให้ ในตัวอย่างนี้ network ของกลุ่มเป้าหมายบน FB ถูกสร้างขึ้นมาจากนั้นก็ลองโพสท์ข่าวลงไป แล้วนับดูว่าแต่ล่ะชั่วโมงมีการแชร์หรือเห็นหรือLike รวมกันจำนวนเท่าใด     ซึ่งวิธีนี้เราสามารถทำโมเดลเพื่อตอบได้ว่าประเภทข่าวหรือรูปแบบนำเสนอแบบใดที่จะถูกแพร่กระจายได้มากกว่ากัน พร้อมกับรู้ด้วยว่าข่าวมันจะถึงจุดอิ่มตัวเมื่อใดซึ่งมันจะช่วยให้เราว่างแผนการโฆษณาได้ง่ายขึ้นครับ    

ทดลองใช้ C# กับงานวิจัย

ปกติผมจะใช้ Mathematica เป็นหลักในการทำงานโดยมากจะเป็นพวกแบบจำลองคณิตศาสตร์ที่ตองการเห็นว่าผลลัพธ์จะเปลี่ยนแปลงไปอย่างไรถ้าตัวแปรที่สนใจบางตัวมีการเปลี่ยนแปลง เพิ่มขึ้นหรือลดลง ซึ่งแน่นอนผมใช้พวกคำสั่ง Manipulate หรือ Dynamic เป็นหลัก แต่มาระยะหลังนี้เริ่มมีการใช้ R ในที่ทำงานกันเยอะ ผมเลยเขียนโมเดลของงานที่ทำใน R ไปพอสมควร แต่มันก็ติดปัญหาว่ามันช้ามากกับหลายโมเดลที่ทำอยู่ถึงแม้จะหันไปใช้ Rcpp แต่ก็รู้สึกว่าเสียเวลาเขียน wrapper functions ห่อพวกมันอีกทีใน R แถมเวลาส่งงานให้ Prof ทั้งหลายก็ติดเรื่อง compiler อีก แถมต้องมาเขียน shiny อีกดูวุ่นวายไปหมด สุดท้ายกลับมาตายรังที่ Mathematica เหมือนเดิม เขียนโมเดลเสร็จ อยากจะส่งให้ชาวบ้านดูก็ใช้เพียงแค่คำสั่ง Deploy ไปบนcloud เท่านั้นจบเลย …แต่มันก็แลกมาด้วยค่าใช้จ่ายพอสมควร ผมเลยหาทางเลือกอื่นๆที่มันประหยัดกับบางงานกับโมเดลที่ไม่ดูซับซ้อนและใช้เวลาทำไม่นาน หันซ้ายหันขวาก็มาจบที่ C# หลังจากดูแล้วก็มี library ที่พอช่วยงานได้อย่าง math.net แถม UI ก็ทำง่ายเพียงลากแปะเท่านั้น เลยทดลองใช้ดู ผลปรากฏว่าเป็นที่น่าพอใจ  ถึงจะดูยุ่งยากในส่วน UI แต่ก็รู้สึกว่าไม่ได้เลวร้ายอะไร ส่งงานก็ง่ายแถมก็ไม่ต้องติดตั้งอะไรให้ดูวุ่นวาย

เรียก Mathematica มาใช้ใน R

อยากใช้ Mathematica ใน R แต่ไม่มีใครเขียน package ไว้ผมก็เลยเขียนเองมันซะเลยเรียกมันว่า WolfinR เอาไว้ใช้ในกันภายในที่ทำงานครับ จริงอยู่อยู่ว่า Mathematica มีแพคเกจที่เรียกว่า RLink ครับแต่ก็อยากใช้มันจาก R ครับไม่มีอะไร  

ส่งผ่านค่าจาก url เข้ามาใน shiny app

ตัวอย่างรับค่าจาก url เข้ามาใช้ใน shiny app ครับ library(shiny) shinyApp( ui = fluidPage( textInput("text", "Text",""), textInput("text2", "Text2","") ), server = function(input, output, session) { observe({ query <- parseQueryString(session$clientData$url_search) if (!is.null(query[['text']])) { updateTextInput(session, "text", value = query[['text']]) } if (!is.null(query[['text2']])) { updateTextInput(session, "text2", value = query[['text2']]) } }) } ) ลองดูเพิ่มเติมที่ https://shiny.rstudio.com/articles/client-data.html

ใช้ .net ใน CRAN สำหรับ Windows

ใครที่อยากใช้โปรแกรมที่เขียนขึ้นเองในภาษาอื่นใน R package มันก็มีหลายวิธีครับขึ้นกับว่าเราจะเขียน wrap function มันอย่างไรแต่ถ้าคิดจะเอาไปไว้ CRAN ก็คงต้องคิดหนักหน่อยเพราะ CRAN เน้นว่าโปรแกรมอื่นที่เขียนจากภาษาอื่นมานั้นต้อง compile จาก source เท่านั้นเวลาที่มีการติดตั้ง และตัว CRAN หรือ R เองก็ไม่ค่อยถูกกับฝั่ง .net ด้วยสินั่นหมายความว่าต้องใช้ compiler อย่าง gnu gcc เท่านั้น แต่มันก็พอมีวิธีครับถ้าอยากจะเอาโปรแกรมที่เขียนหรือcompiled มาแล้วจาก .net มาใช้งาน พร้อมกับส่งไปที่ CRAN ได้และผมก็เห็นหลาย package ทำกันอย่างเช่น https://github.com/jeroen/curl/blob/7fd8d483e5a9d9fd4716d123a855cbb2e0c17b05/tools/winlibs.R # Build against static libraries from rwinlib if(!file.exists("../windows/libcurl-7.51.0/include/curl/curl.h")){ if(getRversion() < "3.3.0") setInternet2() download.file("https://github.com/rwinlib/libcurl/archive/v7.51.0.zip", "lib.zip", quiet = TRUE) dir.create("../windows", showWarnings = FALSE)

ปัญหาโหลด rJava ไม่ได้ (Windows)

มีหลายคนถามมาว่าอยากจะใช้ package ใน R ที่มันใช้ Java ในเครื่องที่เป็น Windowsแต่มีปัญหาว่าโหลด rJava จากคำสั่ง library(rJava) ไม่ได้ โดยมันขึ้นว่า > library(rJava) Error: package or namespace load failed for ‘rJava’: .onLoad failed in loadNamespace() for 'rJava', details: call: inDL(x, as.logical(local), as.logical(now), ...) error: unable to load shared object 'C:/Users/CAMT/Documents/R/win-library/3.4/rJava/libs/x64/rJava.dll': LoadLibrary failure: %1 is not a valid Win32 application. วิธีแก้ที่ผมแนะนำไปนอกเหนือจากที่ต้องลง JDK ก็มีการเซ็ตpath ให้กับตัวแปรของระบบอย่าง

Stan กับ ปัญหา linear regression

จากที่เคยไปโม้ไว้เยอะว่า Stan มันเจ๋งยังไงให้กับเพื่อนร่วมงานฟัง เมื่อวันศุกร์ที่แล้วผมก็เลยนัดโชว์แบบคร่าวๆพร้อมกับสาธิตการใช้งานกับปัญหาง่ายๆอย่าง linear regression ให้เค้าดูกันครับ ก็เลยคิดว่าจะเอาที่ไปโม้ไว้มาใส่ไว้ที่นี่ด้วยเผื่อว่าใครสนใจใช้งาน Stan แต่ไม่รู้จะเริ่มตรงไหน หวังว่าคงมีประโยชน์กันบ้าง Stan จัดว่าเป็น Probabilistic Programming Language อันหนึ่งที่ช่วยให้เราทำโมเดลที่เกี่ยวข้องกับความน่าจะเป็นในแบบที่ต้องอาศัยทฤษฎีเบย์ได้ง่ายขึ้น และปัญหาที่เราสามารถเอา Stan มาใช้ประโยชน์ก็เช่นด้าน optimization ครับ ซึ่งโปรแกรมด้านนี้มันก็มีหลายตัวครับเช่น WinBUGS/OpenBUGS, JAGS และอื่นๆอีกมาก ลองดูเพิ่มเติมที่ http://probabilistic-programming.org/wiki/Home ครับ ตัวอย่างที่เอามาโชว์นี้ก็มาจากที่ผมเคยพูดไว้แล้วที่  http://www.sakngoi.com/2017/03/22/probabilistic-programming-language/ เรื่องที่เราจะหาค่า จากข้อมูลที่เรามีโดยที่โมเดลของเราเป็นสมการเส้นตรง อันนี้ตัวอย่างcode R สำหรับสร้างข้อมูลที่เอามาfitกับ Stan ครับ set.seed(12345) fakedata<-function(alpha, beta, t){ err<-rnorm(length(t),mean = 0, sd = 5) fake<-data.frame(time=t,y=alpha + beta*t +err) return(fake) } ob<-fakedata(alpha = 1.5, beta = 0.5,

ปัญหาcursorเลื่อนไปทางขวาในRStudioเวลาพิมพ์ภาษาไทย

ดูเหมือนปัญหาcursorเลื่อนไปทางขวาในRStudioบน Windows เวลาพิมพ์ภาษาไทยยังไม่ได้ถูกแก้ไข จริงๆแล้วปัญหานี้เป็นปัญหาที่ติดมาจาก ACE ที่ RStudio ใช้เป็นตัว engine หลักสำหรับ editor มีการพูดถึงเรื่องนี้หลายครั้งตามหลายเว็บที่มันยังใช้ได้ไม่ค่อยดีกับ multibyte unicode แต่ก็มีคนที่พยายามแก้ไขอยู่ https://github.com/ajaxorg/ace/pull/1608 แต่ code ที่แก้มายังมี bugs ทำให้ไม่ได้ merge เขาไปกับ ACE หลัก ลองดูที่เค้าแก้มาแล้วได้ที่ https://brionv.com/misc/demo/ace/build/kitchen-sink.html  ลองพิมพ์ภาษาไทยเข้าไปดูแล้วมันใช้ได้เลยไม่มีการเลื่อนcursor แบบแปลกๆแล้ว นี่ยังคิดเลยว่าถ้าพอรู้เรื่องหน่อยเกี่ยวกับ code ที่เค้าเขียนกันจะทำเป็น patch สำหรับ rstudio ให้คนไทยเราได้ใช้กันไปพลางๆก่อน

เหตุผลที่ทำไมกินยาartesunateทุก12ชม.ถึงไม่ช่วยเรื่องการรักษามาลาเรีย

เรื่องมันมีอยู่ว่าแบบจำลองเรื่องการดื้อยาartemisininที่เสนอโดย Saralamba et al. (ผมและทีมงาน) ทำนายว่าการเพิ่มขึ้นของระยะเวลาในการกำจัดเชื้อมาลาเรียจากร่างกายคนไข้เป็นผลมาจากการที่ระยะหนึ่งของเชื้อมาลาเรียที่เรียกว่า Rings หรือวงแหวนนั้นมีการตอบสนองกับยาลดลงพร้อมกับเสนอว่าถ้าเปลี่ยนการให้ยาคนไข้ทุก 24 ชม.มาเป็น ทุก12ชม.จะช่วยลดเวลาของการกำจัดเชื้อได้ดีกว่า แต่จากการศึกษาโดย Das et al. ที่ทดลองให้ยาทุก 12 ชม. และเพิ่มขนาดเป็นของยากับคนไข้มาลาเรียพบว่าระยะในการกำจัดเชื้อไม่เปลี่ยนแปลงมากนัก จากผลที่ได้นี้มันแสดงให้เห็นว่าแบบจำลองที่เสนอไปนั้นต้องมีอะไรผิดพลาดแน่นอนและก็เลยทำให้มีการศึกษากันเพิ่มขึ้นพร้อมกับมีการเสนอสมมุติฐานต่างๆเพิ่มขึ้น ในแบบจำลองอันเดิม เราสมมุติว่าหลังจากที่เชื้อโดนยาแล้วจะตายพร้อมกับถูกกำจัดออกจากร่างการเลย อย่างรวดเร็วโดยม้าม และเป็นเพราะด้วยเหตุผลนี้ที่ทำให้มีการเถียงกันเรื่องการใช้ระยะของการกำจัดเชื้อเป็นตัวบอกถึงการดื้อยาartemisinin ว่าอาจไม่เหมาะสม (https://www.ncbi.nlm.nih.gov/pubmed/26239987) เพราะนั่นหมายความว่าถ้าเชื้อมันยังตอบสนองกับยาได้ดีอยู่ล่ะ แต่ม้ามมันกำจัดเชื้อที่ตายแล้วออกจากร่างการได้ช้ามันก็ดูเหมือนว่าเป็นเชื้อที่ดื้อยาถ้ายังใช้ระยะเวลาในการกำจัดเชื้อเป็นตัวบอกถึงการดื้อยา  แต่มันก็มีหลายงานวิจัยที่แสดงให้เห็นว่าม้ามนั้นกำจัดเชื้อมาลาเรียได้เร็วมากในผู้ป่วยที่รักษาด้วยยาartemisinin (https://www.ncbi.nlm.nih.gov/pubmed/28231817,https://www.ncbi.nlm.nih.gov/pubmed/11992295) ผมและทีมงานก็เลยเปลี่ยนวิธีที่เชื้อมาลาเรียจะตอบสนองกับยาในแบบจำลองโดยแทนที่เชื้อจะตายเลยหลังจากที่โดนยาก็เปลี่ยนมาเป็นเจ็บแทนแล้วค่อยๆตาย และก็ให้ว่าถ้าเชื้อเจ็บอยู่ถึงแม้จะโดนยาอีกก็ไม่ได้มีผลเปลี่ยนแปลงอะไรเลย ผลที่ได้จากแบบจำลองก็ดูเหมือนจะสอดคล้องกับทุกผลที่ได้จาก Das et al. นั่นก็คือถึงแม้จะให้ยาทุก 12 ชม.ก็ไม่ได้ลดระยะในการกำจัดเชื้อสักเท่าไหร่ กราฟด้านล่างนี้เป็นตัวอย่างผลที่ได้จากแบบจำลอง สีชมพูแสดงการลดลงของเชื้อในคนไข้ที่กินยาทุก 24 ชม.และสีฟ้าสำหรับคนไข้ที่กินยาทุก12ชม. ซึ่งแสดงให้เห็นว่าไม่ได้แตกต่างกันเท่าไหร่และกราฟนี้ก็แสดงให้เห็นว่าถ้าเราทำการศึกษาแบบที่ Das et al. ทำ โอกาสที่เราจะได้ว่าระยะของการกำจัดเชื้อแบบกินยาทุก24ชม.กับทุก12ชม.จะไม่แตกต่างกันมีสูงถึงเกือบ 60% ในการศึกษานี้ผมใช้ Stan ในการสร้างแบบจำลองและเปรียบเทียบผลที่ได้กับข้อมูลจริงจากคนไข้ครับ