Выбор различного количества переменных для модели в кадре данных - PullRequest
1 голос
/ 10 января 2012

У меня очень большой фрейм данных, и мне нужно выбрать переменное число, удовлетворяющее определенным критериям анализа (например, переменные в линейной модели). Следующие небольшие данные иллюстрируют мои данные.

set.seed (1234) 
mydf <- data.frame (Id = c("dis", 1:5),

V1.a = c(0,sample(c(0, 1,2), 5, replace = T)),V1.b = c(0,sample(c(0, 1,2), 5, replace = T)),
V2.a = c(1.5,sample(c(0, 1,2), 5, replace = T)),V2.b = c(1.5,sample(c(0, 1,2), 5, replace = T)),
V3.a = c(2.0,sample(c(0, 1,2), 5, replace = T)),V3.b = c(2.0,sample(c(0, 1,2), 5, replace = T)),
V4.a = c(5.0,sample(c(0, 1,2), 5, replace = T)),V4.b = c(5.0,sample(c(0, 1,2), 5, replace = T)),
V5.a = c(6.0,sample(c(0, 1,2), 5, replace = T)),V5.b = c(6.0,sample(c(0, 1,2), 5, replace = T)),
V16a = c(11.0,sample(c(0, 1,2), 5, replace = T)),V6.b = c(11.0,sample(c(0, 1,2), 5, replace = T)),
V7.a = c(12.0,sample(c(0, 1,2), 5, replace = T)),V7.b = c(12.0,sample(c(0, 1,2), 5, replace = T)),
V8.a = c(3.0,sample(c(0, 1,2), 5, replace = T)),V8.b = c(3.0,sample(c(0, 1,2), 5, replace = T)))

Печатные данные:

   Id V1.a V1.b V2.a V2.b V3.a V3.b V4.a V4.b V5.a V5.b V6a V6.b V7.a V7.b V8.a V8.b
1 dis    0    0  1.5  1.5    2    2    6   6    7    7   11   11   12   12    3    3
2   1    1    2  1.0  1.0    2    0    0    1    2    1    2    0    0    2    0    2
3   2    1    2  2.0  0.0    2    0    2    1    2    1    0    0    2    1    1    1
4   3    2    0  1.0  2.0    1    1    1    0    2    0    1    2    0    2    1    0
5   4    0    1  1.0  1.0    1    1    0    1    0    2    2    2    2    1    0    2
6   5    1    0  2.0  2.0    0    2    1    2    1    1    1    0    2    2    2    2

Вот что я хочу сделать:

(1) Сортировать столбцы по значению в первой строке - от меньшего к большему (т. Е. Dis), за исключением столбца ID. Рассмотрим первую строку при сокращении кадра данных

   Id   V1.a V1.b V2.a V2.b V3.a V3.b V4.a V4.b V5.a V5.b V6a V6.b V7.a V7.b V8.a V8.b
 1 dis    0    0  1.5  1.5    2    2    6   6    7    7   11   11   12   12    3    3

Столбцы (переменные) расположены в порядке, кроме V8.a и V8.b. Сокращенные данные должны быть в следующем порядке:

   Id   V1.a V1.b V2.a V2.b V3.a V3.b V8.a V8.b V4.a V4.b V5.a V5.b V6a V6.b V7.a V7.b 
 1 dis    0    0  1.5  1.5    2    2   3   36   6    7    7   11   11   12   12    

(2) Затем вычислите ди разница между соседними переменными по разнице в значении в первом ряду. Например, для V1a и V1b разница равна 0, а для V1.b и V2.a разница составляет 1,5 - 0 = 1,5

.

разница между смежными переменными на основе строки1

V1.a - V1b   V1.b- V2.a  V2.a - V2b  V2.b - V3.a    V3.a - V3.b
    0-0      0 - 1.5    1.5 - 1.5     1.5 - 2        2-2       

и так далее ...

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

mydf1 =  mydf[-1,]   
model1 <- lm(Id ~ V1.a + V1.b + V2.a + V2.b + V3.a + V3.b + V8.a + V8.b, data = mydf1)
model2 <- lm(Id ~ V4.a + V4.b +  V5.a +  V5.b, data = mydf1)
model3 <- lm(Id ~ V6.a + V6.b + V7.a + V7.b, data = mydf1) 

Как я могу автоматизировать этот процесс?

Правки: после ответа

 d = mydf
> d
  Id V1.a V1.b V2.a V2.b V3.a V3.b V4.a V4.b V5.a V5.b V16a V6.b V7.a V7.b V8.a
1  0    0    0  1.5  1.5    2    2    5    5    6    6   11   11   12   12    3
2  1    1    2  1.0  0.0    1    2    1    2    0    1    1    2    0    1    1
3  2    1    1  2.0  2.0    1    2    0    1    0    1    1    1    0    2    0
4  3    0    0  1.0  2.0    2    0    2    2    2    2    2    1    1    2    0
5  4    0    2  0.0  2.0    2    2    1    1    2    2    2    1    2    1    0
6  5    2    1  2.0  0.0    2    0    1    1    0    1    0    0    0    2    1
  V8.b
1    3
2    2
3    0
4    2
5    0
6    2
>  d <- d[,order(d[1,-1])]
> d
  Id V1.a V1.b V2.a V2.b V3.a V7.b V8.a V3.b V4.a V4.b V5.a V5.b V16a V6.b V7.a
1  0    0    0  1.5  1.5    2   12    3    2    5    5    6    6   11   11   12
2  1    1    2  1.0  0.0    1    1    1    2    1    2    0    1    1    2    0
3  2    1    1  2.0  2.0    1    2    0    2    0    1    0    1    1    1    0
4  3    0    0  1.0  2.0    2    2    0    0    2    2    2    2    2    1    1
5  4    0    2  0.0  2.0    2    1    0    2    1    1    2    2    2    1    2
6  5    2    1  2.0  0.0    2    2    1    0    1    1    0    1    0    0    0

Заказ не работает для V7.a!

1 Ответ

3 голосов
/ 10 января 2012

Упорядочить столбцы так, чтобы первая строка была в порядке возрастания order:

d <- d[,c(1,1+order(d[1,-1]))]

Рассчитать разницу d[1,i] - d[1,i-1] (только для первого ряда):

d[1,-1] <- c(0, diff( drop(as.matrix(d[1,-1])) ))

Группируйте переменные по блокам: добавляйте их по одному и начинайте новую группу, если разница, вычисленная на предыдущем шаге, составляет 2 или более.

i <- 1+which( d[1,-1] >= 2 )
i <- data.frame( begin=c(2,i), end=c(i-1,dim(d)[2]) )

Вычисляет модели в цикле, каждый раз создавая новый data.frame:

models <- list()
for(k in 1:dim(i)[1]) {
  tmp <- d[-1, c(1, i$begin[k] : i$end[k])]
  tmp$Id <- as.numeric(as.character(tmp$Id))
  models[[k]] <- lm(Id ~ ., data=tmp)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...