Как быстро назначить значения в г - PullRequest
0 голосов
/ 02 июля 2018

Я хочу запустить регрессию секций в R, для которой мне нужно назначить коэффициент, чтобы указать, к какому разделу относятся эти данные. Например, когда оно больше среднего значения + 2 стандартных отклонения, я назначаю показатель 2, а между средним + 1sd и средним + 2sd, 1 и т. Д. Я знаю, что это может быть сделано, если и еще. Но когда разделов слишком много, код кажется слишком длинным. Существуют ли простые и лаконичные методы для достижения этой цели?

   mean=mean(x)
   sd=sd(x)
   if((x[i]-mean)/sd< -3) signal[i]=-3
   if((x[i]-mean)/sd> -3) signal[i]=-2
   if((x[i]-mean)/sd> -2) signal[i]=-1
   if((x[i]-mean)/sd> -1) signal[i]=0
   if((x[i]-mean)/sd>1) signal[i]=1
   if((x[i]-mean)/sd>2) signal[i]=2
   if((x[i]-mean)/sd>3) signal[i]=3
 } 

Спасибо за @jogo и @ r.user.05apr. Теперь у меня немного другая проблема. Я хочу вычислить раздел на основе скользящих окон, например, 20 дней, что означает, что мне нужно масштабировать данные дня t на основе последних 20 дней (день t-20 - день t-1) и назначать те же значения, что и выше в соответствии с его z баллом. Можно ли в этом случае использовать функцию резки? Я написал код с циклом, и если предложения

signal <- vector()
n=20  #window
for(i in (n+1):length(x)){
  mean=mean(x[(n-20):(n-1)])
  sd=sd(x[(i-20):(i-1)])
  if((x[i]-mean)/sd< -3) signal[i]=-3
  if((x[i]-mean)/sd> -3) signal[i]=-2
  if((x[i]-mean)/sd> -2) signal[i]=-1
  if((x[i]-mean)/sd> -1) signal[i]=0
  if((x[i]-mean)/sd>1) signal[i]=1
  if((x[i]-mean)/sd>2) signal[i]=2
  if((x[i]-mean)/sd>3) signal[i]=3
}

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Зависит от того, насколько динамичным должно быть присвоение значения. Альтернативный вариант:

criteria <- data.frame(operator = c("<", rep(">", 6)),
                       criterion = c(-3, seq(-3, -1, 1), 1:3),
                       result = c(seq(-3, 0, 1), 1:3),
                       stringsAsFactors = FALSE)
criteria # data frame with individual conditions for if

get_signal <- function(mean, sd, x) {
  dummy <- (x-mean)/sd
  for (i in (1:nrow(criteria))) {
    if (do.call(criteria[i, 1], list(dummy, criteria[i, 2]))) res <- criteria[i, 3]
  }
  res
}
sapply(-5:10, function(x) get_signal(2, 1, x))
0 голосов
/ 02 июля 2018

Вы можете использовать cut()

x <- iris$Petal.Length
m <- mean(x)
s <- sd(x)
cut((x - m)/s, breaks = c(-Inf, -3, -2, -1, 1, 2, 3, +Inf), labels = c((-3):3))

, чтобы привести к числовому:

as.numeric(as.character(cut((x - m)/s, breaks = c(-Inf, -3, -2, -1, 1, 2, 3, +Inf), labels = c((-3):3))))

примечание:

Вы можете сократить (x - m)/s до scale(x)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...