учитывая, что у вас нет ковариат, вам не о чем идти. Простейшим способом сделать что-то было бы просто использовать скользящее среднее и преобразовать соответствующим образом
, если у вас есть несколько ковариат для использования и вы хотите сделать что-то гораздо более сложное, тогда вы можете использовать рандомизированный метод / Монте-Карлометод. язык Stan позволяет легко определять и выбирать из байесовских моделей. в этом случае вы могли бы определить простую модель авторегрессии:
data {
int<lower=0> N; // number of data points
int<lower=0> animal[N];
real behaviour[N];
}
parameters {
real mu[N]; // the values you care about
real<lower=0> sigma_auto; // autocorrelation of values
real<lower=0> sigma_behaviour; // how close they should be to data
}
model {
for (i in 2:N) {
if (animal[i] == animal[i-1]) {
// autoregressive component of model
mu[i] ~ normal(mu[i-1], sigma_auto);
}
}
// comparison to data
behaviour ~ normal(mu, sigma_behaviour);
// priors
sigma_auto ~ cauchy(0, 0.05);
sigma_behaviour ~ cauchy(0, 0.05);
}
код немного похож на R, но я бы рекомендовал прочитать руководство . Вы можете запустить его, выполнив:
library(rstan)
df = read.table(text="animalID behaviour
1 1
...
", header=TRUE)
fit <- stan("model.stan", iter=1000, data=list(
N=nrow(df),
animal=df$animalID,
behaviour=df$behaviour
))
plot(df$behaviour)
mu <- extract(fit, 'mu')$mu
for (i in 1:nrow(mu)) {
lines(mu[i,], lwd=0.2)
}
вызов stan
скомпилирует модель (с помощью компилятора C ++) и запустит ее для iter
образцов. линия extract
вытаскивает образцы mu
сзади, а затем я строю их поверх данных.
надеюсь, что это поможет!