Замена значений в векторе на 0 за исключением сэмпла и зацикливание - PullRequest
0 голосов
/ 13 октября 2018

У меня есть вектор, в данном случае «dist_SLA», для которого я хочу сделать следующее:

  • Я хочу взять образцы увеличивающихся размеров, от size = 1 до всехвыбираются значения "dist_SLA" (таким образом, size = 1, size = 2, size = 3, ..... size = "dist_SLA").-> Я назову векторы выборки sample.i

  • Затем я хочу преобразовать все векторы выборки "sample.i" в новые, используя этот метод: вектор должен быть преобразован такчто все значения из "dist_SLA", которые не были выбраны в sample.i, заменены на 0, так что это дает мне вектор, который включает в себя выбранные значения и нули.Я назову новые векторы "sp.i"

  • Наконец, я хочу составить список, который объединяет все вычисленные R-квадраты lm всех различных преобразованных векторов "sp.i"и" dist_SLA "(то есть R-квадрат sp.1 с" dist_SLA "+ R-квадрат sp.2 с" dist_SLA "и т. д.)

Я пробовал следующее:

  dist_SLA <-  c(1, 4, 9, 3, 4, 6)

  for (i in 1:NROW(dist_SLA)){
    sample_[i] <- sample(dist_SLA, size = i )
    sp_[i] <- ifelse(dist_SLA == sample_[i], yes = sample_[i], no = "0")
    lm_[i] <- lm(dist_SLA ~ sp_[i])
    fit_[i] <- summary(lm_[i])$r.squared
    } 

Но это доставляет мне несколько проблем:

  • Функция "ifelse" дает мне вектор, в котором все значения идентичны значению (s) образца не будет заменен на 0 в "sp_1".Поэтому я хочу вектор, в котором только значение выборки не заменено на 0, а остальные.

  • Цикл не работает таким образом, но я не могу понять, как.

Как это исправить?

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Попробуйте:

set.seed(123)
sample_ <- sample(dist_SLA, size = 3)
sample_
[1] 4 3 6
dist_SLA <-  c(1, 4, 9, 3, 4, 6)

Тогда это даст вам

dist_SLA==sample_
[1] FALSE FALSE FALSE FALSE FALSE  TRUE

В то время как использование% в% дает:

dist_SLA %in% sample_
[1] FALSE  TRUE FALSE  TRUE  TRUE  TRUE

И

ifelse(dist_SLA %in% sample_, dist_SLA, 0)
[1] 0 4 0 3 4 6

Таким образом, ваш цикл, в зависимости от того, что вы хотите сохранить для дальнейшего использования, может выглядеть как

set.seed(123)

dist_SLA <-  c(1, 4, 9, 3, 4, 6)
lm_  <- vector(mode = "list", length = length(dist_SLA))
fit_ <- vector(mode = "numeric", length = length(dist_SLA))

for(x in 1 : length(dist_SLA)){

  sample_ <- sample(dist_SLA, size = x)
  spi     <- ifelse(dist_SLA %in% sample_, dist_SLA, 0)
  lm_[[x]]  <- lm(dist_SLA ~ spi)
  fit_[x] <- summary(lm_[[x]])$r.squared
}
0 голосов
/ 13 октября 2018

Я считаю, что следующее делает то, что вы хотите.
Обратите внимание, что вам не нужны векторы sample.i, будут сохранены только значения r-квадрата.так что вам нужен только вектор, где их сохранить.

set.seed(3520)    # Make the results reproducible

dist_SLA <-  c(1, 4, 9, 3, 4, 6)

n <- length(dist_SLA)
fit <- numeric(length(dist_SLA))

for (i in seq_along(dist_SLA)){
  smpl <- sample(n, size = i)
  sp <- numeric(length(dist_SLA))
  sp[smpl] <- dist_SLA[smpl]
  lmi <- lm(dist_SLA ~ sp)
  fit[i] <- summary(lmi)$r.squared
} 

fit
#[1] 0.6480000 0.0200000 0.1739130 0.7667327 0.8711111 1.0000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...