คำนวณ Transition Matrix (Markov) ใน R


29

มีวิธีใน R (ฟังก์ชันในตัว) ในการคำนวณเมทริกซ์การเปลี่ยนแปลงสำหรับ Markov Chain จากชุดการสังเกตหรือไม่?

ตัวอย่างเช่นการใช้ชุดข้อมูลดังต่อไปนี้และคำนวณเมทริกซ์การเปลี่ยนแปลงคำสั่งแรก?

dat<-data.frame(replicate(20,sample(c("A", "B", "C","D"), size = 100, replace=TRUE)))

เมทริกซ์นี้ควรเป็นตัวแทนอะไร? การวิ่งของลูกโซ่มาร์คอฟหนึ่งครั้งสำหรับแต่ละแถว (หรือคอลัมน์)? หรือ...?
พระคาร์ดินัล

นี่คือตัวอย่าง 100 ตัวอย่างของลำดับรัฐ (20 รายการ)
B_Miner

คุณกำลังมองหาการประมาณความน่าจะเป็นหรือแค่นับ?
พระคาร์ดินัล

การประมาณความน่าจะเป็น การใช้ลำดับที่สังเกตได้เมทริกซ์ความน่าจะเป็นการเปลี่ยนแปลงคืออะไร (4x4 ในตัวอย่างนี้)
B_Miner

คำตอบ:


33

ฉันไม่ได้ตระหนักถึงฟังก์ชั่น "ในตัว" ทันที (เช่นในbaseหรือใกล้เคียง) แต่เราสามารถทำได้อย่างง่ายดายและมีประสิทธิภาพในสองบรรทัดของรหัส

นี่คือฟังก์ชั่นที่รับเมทริกซ์ (ไม่ใช่เฟรมข้อมูล) เป็นอินพุตและสร้างการนับการเปลี่ยนแปลง ( prob=FALSE) หรือโดยค่าเริ่มต้น ( prob=TRUE) ความน่าจะเป็นของการเปลี่ยนแปลงโดยประมาณ

# Function to calculate first-order Markov transition matrix.
# Each *row* corresponds to a single run of the Markov chain
trans.matrix <- function(X, prob=T)
{
    tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
    if(prob) tt <- tt / rowSums(tt)
    tt
}

หากคุณต้องการเรียกมันในกรอบข้อมูลคุณสามารถทำได้เสมอ

trans.matrix(as.matrix(dat))

หากคุณกำลังมองหาแพ็คเกจบุคคลที่สามRseekหรือเว็บไซต์ค้นหา Rอาจจัดหาทรัพยากรเพิ่มเติม


1
+1 นอกจากนี้ยังมีแพ็คเกจ R หลายแพ็คเกจซึ่งรวมถึงHMMและRHMMอาจเป็นประโยชน์
เวย์น

@Wayne: (+1) ฉันได้พบแพคเกจ HMM ต่างๆที่มีอยู่ในRการพิถีพิถันมากในอดีตโดยเฉพาะอย่างยิ่งเมื่อมันมาถึงที่เหมาะสมและฉันไม่เคยพบคนที่ฉันชอบหรือเชื่อถือได้อย่างแท้จริง บางทีสถานการณ์ก็ดีขึ้นแล้ว ฉันคิดว่าพวกเขาจะได้รับสิทธินี้ หากคุณรู้วิธีแก้ปัญหาดังกล่าวโปรดส่งเป็นคำตอบ ฉันยินดีที่จะให้คะแนน!
พระคาร์ดินัล

1
ฉันพยายาม แต่ก็ไม่ประสบความสำเร็จ ปัญหานี้ไม่เกี่ยวข้องกับสถานะที่ซ่อนอยู่และแพ็คเกจที่ฉันพบไม่มีฟังก์ชั่นยูทิลิตี้ใด ๆ ที่จะทำอะไรได้น้อยกว่า HMM แบบเต็มเป่า (ตามบันทึกด้านข้างdatกรอบข้อมูลที่ OP ให้เป็นตัวอย่างมีคอลัมน์ของข้อมูลและพวกเขาต้องการเมทริกซ์การเปลี่ยนแปลงต่อคอลัมน์หรือเมทริกซ์การเปลี่ยนแปลงโดยรวมหรือเราสามารถเปลี่ยนเมทริกซ์เป็นเวกเตอร์ได้ไหม?)
เวย์น

@Wayne: (+1) คุณยกระดับจุดที่ดี ฉันได้สันนิษฐานว่าแต่ละแถวเป็นการวิ่งอิสระของห่วงโซ่มาร์คอฟดังนั้นเราจึงค้นหาการประมาณความน่าจะเป็นในการเปลี่ยนแปลงจากโซ่เหล่านี้วิ่งขนานกัน แต่ถึงแม้ว่านี่จะเป็นโซ่ที่พูดเรียงจากปลายด้านหนึ่งของแถวลงไปจนถึงจุดเริ่มต้นของถัดไปการประมาณการจะยังคงใกล้กว่าเนื่องจากโครงสร้างมาร์คอฟ
พระคาร์ดินัล

1
@B_Miner: ใช่มันทำตราบใดที่คุณสามารถสันนิษฐานได้ว่าลูกค้าแต่ละคนมีพฤติกรรมที่เป็นอิสระจากคนอื่น ๆ ทั้งหมด โมเดลดังกล่าวและส่วนขยายจำนวนมากนั้นค่อนข้างพบได้บ่อยในการวิเคราะห์พฤติกรรมของผู้ใช้เช่นในการเข้าชมเว็บไซต์ซ้ำ ๆ เป็นต้น
cardinal

25

ฉันเพิ่งอัปโหลดแพ็คเกจ R ใหม่markovchainตามรูปแบบการเขียนโปรแกรม S4 พร้อมกับวิธีการต่าง ๆ ในการจัดการกับวัตถุ S4 markovchain มันมีฟังก์ชั่นเพื่อให้พอดีกับห่วงโซ่มาร์คอฟจากลำดับของรัฐ มองไปที่:

library(markovchain) 
sequence <- c("a", "b", "a", "a", "a", "a", "b", "a", "b", "a", 
              "b", "a", "a", "b", "b", "b", "a")
mcFit <- markovchainFit(data=sequence)

มันสามารถช่วย


แพ็คเกจที่ดีมาก! คุณจะสนับสนุนเชนมาร์คอฟที่มีลำดับสูงกว่าหรือไม่?
เวย์น

ฉันถูกขอให้สั่งซื้อลูกโซ่มาร์คอฟที่สูงกว่าและอีกคนกำลังเขียนรหัส หากคุณต้องการที่จะมีส่วนร่วมในการพัฒนารหัสส่งอีเมลไปยังที่อยู่ mantainer และเราสามารถพูดคุย ...
Giorgio Spedicato

สวัสดีความแตกต่างระหว่าง markovchainFit และฟังก์ชั่นโพสต์ข้างต้นคืออะไร? พวกเขาให้ผลลัพธ์เดียวกันหรือไม่ ขอบคุณ
aaaaa

1
markovchainFit
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.