#r
#r
Вопрос:
Я начинающий пользователь R, работающий над алгоритмом Метрополиса-Гастингса для оценки местоположения со смешанными эффектами и масштабной модели, для которой программное обеспечение ограничено.
Имеющиеся у меня данные являются продольными и в накопленном формате. Пример кода того, как это выглядит для трех участников, представлен ниже. Обратите внимание, что пять временных точек сбалансированы ради этого примера, но время неизбежно будет несбалансированным (т. Е. отсутствует и рассматривается как непрерывное) при использовании реальных данных. Этот факт исключает использование многомерного / широкого формата (т.Е. GLM).
N = 3 #number of people
PersonID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
Time = c(0,1,2,3,4,0,1,2,3,4,0,1,2,3,4)
Y = c(15,16,17,18,19,20,21,22,23,24,25,26,27,28,29)
df = data.frame(PersonID,Time,Y)
В настоящее время я пытаюсь оценить вероятность данных, используя текущий и потенциальный случайный перехват для каждого человека (U0i). Это делается путем индивидуальной оценки данных каждого участника. Однако, прежде чем я начну оценивать эти вероятности, я хочу начать с малого и получить представление о том, что R требует, поэтому…
Я просто пытаюсь оценить индивидуальную модель линейной регрессии по данным каждого участника. Начиная с этого, я получу представление о том, как должен выглядеть код, чтобы заставить R работать с данными отдельных участников, когда данные имеют формат stacked. Я перепробовал так много итераций того, что, как я думал, было бы правильным, но вот моя последняя неудача,
for (person in 1:N){
if (PersonID == person){
summary(lm(df$Y ~ df$Time))
}
}
что приводит к приведенной ниже ошибке:
1: In if (PersonID == person) { :
the condition has length > 1 and only the first element will be used
Очевидно, оператору IF не нравится, что мои данные сложены, с > 1 строкой на участника. Мне нужно, чтобы данные оставались в сложенном формате. О, я безуспешно пробовал IFELSE, но, вероятно, я перепутал этот код. Приветствуются любые идеи.
Спасибо!
Райан
Ответ №1:
Вероятно, это чаще делается с помощью lapply
. Наблюдайте
results <- lapply(1:N, function(p) {
summary(lm(Y~Time, df, subset=PersonID==p))
})
в основном lapply будет перебирать идентификаторы персон 1,2, …, N. Вы также могли бы вместо этого указать unique(df$PersonID)
, не являются ли они последовательными целыми числами. Затем мы выполняем регрессию для каждого человека, просто подставляя данные для этого конкретного идентификатора человека. Результаты сохраняются в виде списка. Итак, если бы мы хотели получить результат от первого лица, мы могли бы сделать
results[[1]]
и если бы мы хотели увидеть коэффициенты для всех моделей, мы могли бы сделать
lapply(results, coef)