Tôi nghĩ rằng đây là một vấn đề thú vị, vì vậy tôi đã viết một tập dữ liệu mẫu và một công cụ ước tính độ dốc tuyến tính trong R. Tôi hy vọng nó sẽ giúp bạn với vấn đề của bạn. Tôi sẽ đưa ra một số giả định, lớn nhất là bạn muốn ước tính độ dốc không đổi, được đưa ra bởi một số phân đoạn trong dữ liệu của bạn. Một giả định khác để phân tách các khối dữ liệu tuyến tính là 'thiết lập lại' tự nhiên sẽ được tìm thấy bằng cách so sánh các khác biệt liên tiếp và tìm ra các độ lệch chuẩn X dưới giá trị trung bình. (Tôi đã chọn 4 sd, nhưng điều này có thể thay đổi)
Đây là một biểu đồ của dữ liệu và mã để tạo ra nó ở phía dưới.
Để bắt đầu, chúng tôi tìm thấy các ngắt và khớp với từng bộ giá trị y và ghi lại các sườn.
# Find the differences between adjacent points
diffs = y_data[-1] - y_data[-length(y_data)]
# Find the break points (here I use 4 s.d.'s)
break_points = c(0,which(diffs < (mean(diffs) - 4*sd(diffs))),length(y_data))
# Create the lists of y-values
y_lists = sapply(1:(length(break_points)-1),function(x){
y_data[(break_points[x]+1):(break_points[x+1])]
})
# Create the lists of x-values
x_lists = lapply(y_lists,function(x) 1:length(x))
#Find all the slopes for the lists of points
slopes = unlist(lapply(1:length(y_lists), function(x) lm(y_lists[[x]] ~ x_lists[[x]])$coefficients[2]))
Dưới đây là các sườn dốc: (3.309110, 4.419178, 3.292029, 4.531126, 3.675178, 4.294389)
Và chúng ta chỉ có thể lấy giá trị trung bình để tìm độ dốc dự kiến (3,920168).
Chỉnh sửa: Dự đoán khi loạt đạt 120
Tôi nhận ra rằng tôi đã không hoàn thành dự đoán khi chuỗi đạt tới 120. Nếu chúng tôi ước tính độ dốc là m và chúng tôi thấy thiết lập lại tại thời điểm t thành giá trị x (x <120), chúng tôi có thể dự đoán sẽ mất bao lâu để đạt được 120 bằng một số đại số đơn giản.
Ở đây, t là thời gian cần thiết để đạt 120 sau khi thiết lập lại, x là giá trị đặt lại và m là độ dốc ước tính. Tôi thậm chí sẽ không chạm vào chủ đề của các đơn vị ở đây, nhưng đó là cách tốt để xử lý chúng và đảm bảo mọi thứ đều có ý nghĩa.
Chỉnh sửa: Tạo dữ liệu mẫu
Dữ liệu mẫu sẽ bao gồm 100 điểm, nhiễu ngẫu nhiên với độ dốc là 4 (Hy vọng chúng tôi sẽ ước tính điều này). Khi các giá trị y đạt đến ngưỡng cắt, chúng sẽ đặt lại thành 50. Điểm cắt được chọn ngẫu nhiên trong khoảng từ 115 đến 120 cho mỗi lần đặt lại. Đây là mã R để tạo tập dữ liệu.
# Create Sample Data
set.seed(1001)
x_data = 1:100 # x-data
y_data = rep(0,length(x_data)) # Initialize y-data
y_data[1] = 50
reset_level = sample(115:120,1) # Select initial cutoff
for (i in x_data[-1]){ # Loop through rest of x-data
if(y_data[i-1]>reset_level){ # check if y-value is above cutoff
y_data[i] = 50 # Reset if it is and
reset_level = sample(115:120,1) # rechoose cutoff
}else {
y_data[i] = y_data[i-1] + 4 + (10*runif(1)-5) # Or just increment y with random noise
}
}
plot(x_data,y_data) # Plot data