Làm cách nào tôi có thể tạo chuỗi thời gian nhị phân sao cho:
- Xác suất trung bình quan sát 1 được chỉ định (giả sử 5%);
- 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)?
Làm cách nào tôi có thể tạo chuỗi thời gian nhị phân sao cho:
Câu trả lời:
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.
Từ tuyên bố 2, chúng ta có và bảo tồn đơn giản sau đó nói P 10 = 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,963158
.
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.
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.
for
vò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 0
của và 1
.
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
Dưới đây là một câu trả lời dựa trên markovchain
gó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:
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
theo trực giác, tương ứng với ý tưởng rằng có một số xác suất hệ thống vẫn ở cùng trạng thái và xác suất 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 ( 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 từ chỉ định thông qua .
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.