Làm thế nào để tạo dữ liệu chuỗi thời gian nhị phân tương quan tự động ngẫu nhiên?


15

Làm cách nào tôi có thể tạo chuỗi thời gian nhị phân sao cho:

  1. Xác suất trung bình quan sát 1 được chỉ định (giả sử 5%);
  2. Xác suất có điều kiện quan sát 1 lúc đưa giá trị tại t - 1 (nói 30% nếu t - 1 giá trị là 1)?tt1t1

Câu trả lời:


17

Sử dụng chuỗi Markov hai trạng thái.

Nếu các trạng thái được gọi là 0 và 1, thì chuỗi có thể được biểu diễn bằng ma trận 2x2 đưa ra xác suất chuyển tiếp giữa các trạng thái, trong đó P i j là xác suất chuyển từ trạng thái i sang trạng thái j . Trong ma trận này, mỗi hàng nên tổng bằng 1.0.PPTôijTôij

Từ tuyên bố 2, chúng ta có và bảo tồn đơn giản sau đó nói P 10 = 0,7 .P11=0.3P10=0.7

Từ câu 1, bạn muốn xác suất dài hạn (còn gọi là trạng thái cân bằng hoặc trạng thái ổn định) là . Điều này nói rằng P 1 = 0,05 = 0,3 P 1 + P 01 ( 1 - P 1 ) Việc giải quyết cho P 01 = 0,0368421 và ma trận chuyển tiếp P = ( 0,963158P1=0.05

P1=0.05=0.3P1+P01(1P1)
P01=0,0368421
P=(0.9631580.03684210.70.3)

.

Bây giờ trong chương trình số ngẫu nhiên của bạn, hãy bắt đầu bằng cách chọn ngẫu nhiên trạng thái 0 hoặc 1; cái này chọn hàng nào bạn đang sử dụng. Sau đó sử dụng một số ngẫu nhiên thống nhất để xác định trạng thái tiếp theo. Nhổ ra số đó, rửa sạch, lặp lại khi cần thiết.P


Giải pháp thú vị! Bạn có thể có một số mã mẫu trong R? Antone khác?
dùng333

@Mike Bạn có thể vui lòng đăng ký tài khoản của bạn? Bạn là một người dùng khá tích cực và chúng tôi phải hợp nhất nó nhiều lần. Quá trình này khá dễ dàng; chỉ lần stats.stackexchange.com/login

Cảm ơn. Làm cách nào để ước tính chuỗi Markov (ma trận chuyển tiếp) được cung cấp dữ liệu? Có một chức năng R để làm điều đó?
dùng333

6

Tôi đã giải mã được câu trả lời @Mike Anderson trong R. Tôi không thể tìm ra cách thực hiện bằng cách sử dụng sapply, vì vậy tôi đã sử dụng một vòng lặp. Tôi đã thay đổi các probs một chút để có kết quả thú vị hơn và tôi đã sử dụng 'A' và 'B' để thể hiện các trạng thái. Cho tôi biết bạn nghĩ gì.

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

/ chỉnh sửa: Đáp lại bình luận của Paul, đây là một công thức thanh lịch hơn

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))

Tôi đã viết mã ban đầu khi tôi chỉ học R, vì vậy hãy cắt cho tôi một chút chùng. ;-)

Đây là cách bạn ước tính ma trận chuyển tiếp, đưa ra chuỗi:

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

Thứ tự được hoán đổi so với ma trận chuyển tiếp ban đầu của tôi, nhưng nó có xác suất đúng.


Tuyệt quá! Tôi sẽ sớm tức giận ... Có vẻ đủ tốt ....
user333

Có thể làm ngược lại? Cho chuỗi ước lượng ma trận?
dùng333

Pr(Xt= =Tôi|Xt-1= =j)

+1, nhưng tôi cũng có một số nhận xét: Một forvòng lặp sẽ sạch hơn một chút ở đây, bạn biết độ dài của Series, vì vậy chỉ cần sử dụng for(i in 2:length(Series)). Điều này giúp loại bỏ sự cần thiết cho i = i + 1. Ngoài ra, tại sao mẫu đầu tiên A, và sau đó chuyển đổi thành 0,1? Bạn có thể trực tiếp lấy mẫu 0của và 1.
Paul Hiemstra

2
Nói chung, sau đó bạn có thể bọc nó trong một chức năng mới 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);để cho phép tự động sửa lỗi độ trễ 1 được chỉ định trước
Tom Wenseleers

1

Dưới đây là một câu trả lời dựa trên markovchaingói có thể được khái quát hóa cho các cấu trúc phụ thuộc phức tạp hơn.

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)

Điều này mang lại cho bạn:

nhập mô tả hình ảnh ở đây


0

Tôi đã mất dấu vết của bài báo về cách tiếp cận này được mô tả, nhưng ở đây đi.

Phân tách ma trận chuyển tiếp thành

T= =(1-pt)[1001]+pt[p0p0(1-p0)(1-p0)]= =(1-pt)Tôi+ptE

theo trực giác, tương ứng với ý tưởng rằng có một số xác suất 1-pt hệ thống vẫn ở cùng trạng thái và xác suất pt rằng trạng thái được ngẫu nhiên hóa, trong đó ngẫu nhiên có nghĩa là rút ra độc lập từ phân phối cân bằng cho trạng thái tiếp theo (p0 là xác suất cân bằng để ở trạng thái đầu tiên).

Lưu ý rằng từ dữ liệu bạn đã chỉ định, bạn cần giải quyết pt từ chỉ định T11 thông qua T11= =(1-pt)+pt(1-p0).

Một trong những tính năng hữu ích của sự phân tách này là nó khá đơn giản khái quát hóa cho lớp các mô hình Markov tương quan trong các vấn đề chiều cao hơn.


Nếu bất cứ ai đã nhìn thấy bài báo phát triển đại diện này, xin vui lòng cho tôi biết.
Dave
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.