Как соотнести данные с уровнями факторов? - PullRequest
0 голосов
/ 03 октября 2019

Я хочу связать некоторые виды поведения, закодированные как факторы, с непрерывной ковариацией. Основной мотивацией является то, что животное меняет свое поведение с поиска (поведение 1) на кормление (поведение 2) по мере приближения к ковариате (скажем, к расстоянию до еды).

Таким образом, ковариата должна быть большой (большое расстояние до еды), когда животное находится в поведении 1, и становиться меньше по мере приближения к поведению 2 и пока оно находится в этом состоянии (короткое расстояние до еды). Одна морщина в том, что у меня есть несколько животных.

Данные у меня выглядят примерно так:

animalID behaviour 
1         1
1         1      
1         1
1         2
1         2
1         2
1         1
1         1
2         1
2         1
2         1
2         2
2         2
2         2
2         1

, и я хочу что-то вроде этого

animalID behaviour distance
1         1          100
1         1           99
1         1           98
1         2           58
1         2           57
1         2           60
1         1           74
1         1           75
2         1           104
2         1           101
2         1           100
2         2           40
2         2           44
2         2           42
2         1           86

1 Ответ

1 голос
/ 04 октября 2019

учитывая, что у вас нет ковариат, вам не о чем идти. Простейшим способом сделать что-то было бы просто использовать скользящее среднее и преобразовать соответствующим образом

, если у вас есть несколько ковариат для использования и вы хотите сделать что-то гораздо более сложное, тогда вы можете использовать рандомизированный метод / Монте-Карлометод. язык 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 сзади, а затем я строю их поверх данных.

надеюсь, что это поможет!

...