Создайте фрейм данных с результатами простой линейной регрессии - PullRequest
2 голосов
/ 22 февраля 2012

У меня есть временной ряд индивидуального индекса состояния организма.Я хочу определить для каждого человека эволюцию индекса состояния тела с течением времени.Другими словами, я хочу создать линейную регрессию для каждого человека, а затем собрать все результаты (перехват и наклон) в кадр данных, который будет выглядеть следующим образом:

Первый столбец: Индивидуальный идентификатор

Второй столбец: Перехват

Три столбца: Наклон

Это то, что я пробовал (только с образцом моего набора данных), но я получаю только список всех результатов, и я нене знаю, как объединить их в один фрейм данных:

individual <- c(1,1,6,8,8,9,9,9,12,12)
day <- c(4,17,12,12,17,3,9,22,13,20)
condition <- c(0.72, 0.72, 0.67, 0.73, 0.76, 0.65, 0.68, 0.78, 0.73, 0.71)       
test <- data.frame(individual, day, condition)
ind.id <- unique(test$individual)
ind.list <- lapply(1:length(ind.id), function(i){ subset(test, test$individual==ind.id[i])})
lms <- lapply(ind.list, lm, formula=condition~day)

Спасибо!

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

Я бы использовал пакет plyr, который имеет несколько приятных для вас преимуществ:

  1. функция ddply() будет оценивать lm () по отдельности или по любой другой указанной вами группирующей переменной
  2. Возвращает data.frame по умолчанию

Код:

library(plyr)
ddply(test, "individual", function(x) {
  model <- lm(condition ~ day, data = x)
  coef(model)
})

Возвращает:

  individual (Intercept)           day
1          1   0.7200000  1.207763e-17
2          6   0.6700000            NA
3          8   0.6580000  6.000000e-03
4          9   0.6242403  6.978799e-03
5         12   0.7671429 -2.857143e-03

Если вы не хотите использовать plyr или просто хотите знать, как это сделать с помощью базы R, вот один из подходов. Обратите внимание, что по умолчанию ваш объект списка lms не имеет имен, связанных с ним, поэтому вы должны убедиться, что ind.id соответствует правильным коэффициентам. Я, вероятно, сам использовал бы подход plyr.

> cbind(ind.id, do.call("rbind",lapply(lms, coef)))
   ind.id (Intercept)           day
1       1   0.7200000  1.207763e-17
6       6   0.6700000            NA
8       8   0.6580000  6.000000e-03
9       9   0.6242403  6.978799e-03
12     12   0.7671429 -2.857143e-03
2 голосов
/ 22 февраля 2012

Посмотрите на lmList в пакете nlme.В более общем случае вы можете выбрать одну смешанную модель (nlme или lme4), а не отдельные модели для каждого предмета.

2 голосов
/ 22 февраля 2012

Мне нравится plyr для этих случаев:

ldply(lms, function(x) x$coefficients)


  (Intercept)           day
1   0.7200000  1.207763e-17
2   0.6700000            NA
3   0.6580000  6.000000e-03
4   0.6242403  6.978799e-03
5   0.7671429 -2.857143e-03
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...