วิธีสร้างข้อมูลอนุกรมเวลาไบนารีอัตโนมัติแบบสุ่มที่มีความสัมพันธ์กันอย่างไร


15

ฉันจะสร้างอนุกรมเวลาแบบไบนารี่ได้อย่างไร:

  1. ความน่าจะเป็นโดยเฉลี่ยของการสังเกต 1 ถูกระบุ (พูด 5%)
  2. ความน่าจะเป็นแบบมีเงื่อนไขของการสังเกต 1 ที่เวลาให้ค่าที่t - 1 (พูด 30% ถ้าt - 1tt1t1เท่ากับ 1)?

คำตอบ:


17

ใช้ลูกโซ่มาร์คอฟสองสถานะ

หากรัฐจะเรียกว่า 0 และ 1 แล้วห่วงโซ่ที่สามารถแสดงโดย 2x2 เมทริกซ์ให้ความน่าจะเป็นการเปลี่ยนแปลงระหว่างรัฐที่P ฉันคือความน่าจะเป็นในการเคลื่อนย้ายจากรัฐฉันไปยังรัฐเจ ในเมทริกซ์นี้แต่ละแถวควรรวมถึง 1.0PPijiJ

จากงบ 2 เรามีและการอนุรักษ์ง่ายๆก็บอกP 10 = 0.7P11=0.3P10=0.7

จากงบ 1 คุณต้องการความน่าจะเป็นในระยะยาว (เรียกอีกอย่างสมดุลหรือมั่นคงของรัฐ) จะเป็น 0.05 สิ่งนี้บอกว่าP 1 = 0.05 = 0.3 P 1 + P 01 ( 1 - P 1 ) การ แก้ปัญหาให้P 01 = 0.0368421และเมทริกซ์การเปลี่ยนแปลงP = ( 0.963158 0.0368421 0.7 0.3 )P1=0.05

P1=0.05=0.3P1+P01(1-P1)
P01=0.0368421
P=(0.9631580.03684210.70.3)

(คุณสามารถตรวจสอบความถูกต้องของเมทริกซ์ transtion ของคุณได้โดยการเพิ่มมันให้สูง - ในกรณีนี้ 14 ทำงาน - - แต่ละแถวของผลลัพธ์ให้ความน่าจะเป็นที่มั่นคงเหมือนกัน)

P


ทางออกที่น่าสนใจ! คุณอาจมีรหัสตัวอย่างใน R หรือไม่? ทำอย่างอื่นอีกไหม?
user333

@Mike คุณสามารถลงทะเบียนบัญชีของคุณได้ไหม? คุณเป็นผู้ใช้ที่ใช้งานอยู่และเราต้องรวมมันด้วยตนเองซ้ำแล้วซ้ำอีก กระบวนการนี้ค่อนข้างง่าย เพียงเข้าไปที่ stats.stackexchange.com/login

ขอบคุณ ฉันจะประเมินเชนของมาร์คอฟ (เมทริกซ์การเปลี่ยนแปลง) ที่ได้รับจากข้อมูลได้อย่างไร มีฟังก์ชั่น R สำหรับการทำเช่นนั้นหรือไม่?
user333

6

ฉันใช้คำสั่ง @ ไมค์แอนเดอร์สันในรอยร้าวฉันไม่สามารถรู้ได้ว่าจะทำอย่างไรโดยใช้คำพูดไพเราะดังนั้นฉันจึงใช้วงวน ฉันเปลี่ยนโพรบเล็กน้อยเพื่อให้ได้ผลลัพธ์ที่น่าสนใจยิ่งขึ้นและฉันใช้ 'A' และ 'B' เพื่อเป็นตัวแทนของรัฐ แจ้งให้เราทราบสิ่งที่คุณคิด.

set.seed(1234)
TransitionMatrix <- data.frame(A=c(0.9,0.7),B=c(0.1,0.3),row.names=c('A','B'))
Series <- c('A',rep(NA,99))
i <- 2
while (i <= length(Series)) {
    Series[i] <- ifelse(TransitionMatrix[Series[i-1],'A']>=runif(1),'A','B')
    i <- i+1
}
Series <- ifelse(Series=='A',1,0)
> Series
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1
 [38] 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [75] 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1

/ แก้ไข: เพื่อตอบสนองต่อความคิดเห็นของ Paul นี่เป็นสูตรที่หรูหรากว่า

set.seed(1234)

createSeries <- function(n, TransitionMatrix){
  stopifnot(is.matrix(TransitionMatrix))
  stopifnot(n>0)

  Series <- c(1,rep(NA,n-1))
  random <- runif(n-1)
  for (i in 2:length(Series)){
    Series[i] <- TransitionMatrix[Series[i-1]+1,1] >= random[i-1]
  }

  return(Series)
}

createSeries(100, matrix(c(0.9,0.7,0.1,0.3), ncol=2))

ฉันเขียนรหัสดั้งเดิมเมื่อฉันเพิ่งเรียนรู้ R ดังนั้นลดความหย่อนของฉันลงเล็กน้อย ;-)

นี่คือวิธีที่คุณจะประมาณเมทริกซ์การเปลี่ยนแปลงกำหนดชุดข้อมูล:

Series <- createSeries(100000, matrix(c(0.9,0.7,0.1,0.3), ncol=2))
estimateTransMatrix <- function(Series){
  require(quantmod)
  out <- table(Lag(Series), Series)
  return(out/rowSums(out))
}
estimateTransMatrix(Series)

   Series
            0         1
  0 0.1005085 0.8994915
  1 0.2994029 0.7005971

คำสั่งซื้อนั้นสลับกับเมทริกซ์การเปลี่ยนแปลงดั้งเดิมของฉัน แต่ได้รับความน่าจะเป็นที่ถูกต้อง


ที่ดี! ฉันจะโกรธทันที ... ดูดีพอ ....
333

เป็นไปได้ไหมที่จะทำอินเวอร์ส? รับชุดประเมินเมทริกซ์?
user333

Pr(Xt=i|Xt1=j)

+1 แต่ฉันยังมีความคิดเห็นบางส่วน: เป็นforห่วงจะทำความสะอาดบิตที่นี่คุณจะรู้ว่าความยาวของดังนั้นเพียงแค่การใช้งานSeries นี้จะช่วยลดความจำเป็นในการfor(i in 2:length(Series)) i = i + 1ทำไมตัวอย่างแรกAแล้วแปลงเป็น0,1? คุณสามารถสุ่มตัวอย่าง0และ1โดยตรงได้
Paul Hiemstra

2
โดยทั่วไปแล้วคุณสามารถห่อมันในฟังก์ชั่นใหม่createAutocorBinSeries = function(n=100,mean=0.5,corr=0) { p01=corr*(1-mean)/mean createSeries(n,matrix(c(1-p01,p01,corr,1-corr),nrow=2,byrow=T)) };createAutocorBinSeries(n=100,mean=0.5,corr=0.9);createAutocorBinSeries(n=100,mean=0.5,corr=0.1);เพื่ออนุญาตให้มีการหน่วงเวลาอัตโนมัติตามที่กำหนดไว้ล่วงหน้า 1 autocorrelation
Tom Wenseleers

1

นี่คือคำตอบตามmarkovchainแพคเกจที่สามารถวางนัยกับโครงสร้างการพึ่งพาที่ซับซ้อนมากขึ้น

library(markovchain)
library(dplyr)

# define the states
states_excitation = c("steady", "excited")

# transition probability matrix
tpm_excitation = matrix(
  data = c(0.2, 0.8, 0.2, 0.8), 
  byrow = TRUE, 
  nrow = 2,
  dimnames = list(states_excitation, states_excitation)
)

# markovchain object
mc_excitation = new(
  "markovchain",
  states = states_excitation,
  transitionMatrix = tpm_excitation,
  name = "Excitation Transition Model"
)

# simulate
df_excitation = data_frame(
  datetime = seq.POSIXt(as.POSIXct("01-01-2016 00:00:00", 
                                   format = "%d-%m-%Y %H:%M:%S", 
                                   tz = "UTC"), 
                        as.POSIXct("01-01-2016 23:59:00", 
                                   format = "%d-%m-%Y %H:%M:%S", 
                                   tz = "UTC"), by = "min"),
  excitation = rmarkovchain(n = 1440, mc_excitation))

# plot
df_excitation %>% 
  ggplot(aes(x = datetime, y = as.numeric(factor(excitation)))) + 
  geom_step(stat = "identity") + 
  theme_bw() + 
  scale_y_discrete(name = "State", breaks = c(1, 2), 
                   labels = states_excitation)

สิ่งนี้จะช่วยให้คุณ:

ป้อนคำอธิบายรูปภาพที่นี่


0

ฉันหลงทางกระดาษที่อธิบายวิธีการนี้ แต่ที่นี่ไป

สลายเมทริกซ์การเปลี่ยนแปลงเป็น

T=(1pt)[1001]+pt[p0p0(1p0)(1p0)]=(1pt)I+ptE

1ptptp0

ptT11T11=(1pt)+pt(1p0) )

หนึ่งในคุณสมบัติที่มีประโยชน์ของการย่อยสลายนี้คือมันค่อนข้างตรงไปตรงมากับคลาสของโมเดล Markov ที่มีความสัมพันธ์ในปัญหามิติที่สูงขึ้น


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