Как предсказать модели со случайными и фиксированными эффектами?

Я совсем недавно перешел со STATA на R, и у меня возникли проблемы с реализацией R-эквивалента команд STATA xtlogit,fe or re и predict. Могу я попросить помощи в корректировке следующего сценария:

  data <- read.table("http://people.stern.nyu.edu/wgreene/Econometrics/healthcare.csv",header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)

   require(caret) # for confusionMatrix

   #### subset into test & train according to the panel nature (split  individuals rather then observations)
   nID <- length(unique(data$id))
   p = 0.50# partition

   inTrain <- sample(unique(data$id), round(nID * p), replace=FALSE)

   training <- data[data$id %in% inTrain, ] 

   testing <- data[!data$id %in% inTrain, ] 


   pooled <- glm(WORKING~WHITEC+FEMALE+BLUEC+HHNINC+AGE+AGESQ+EDUC+DOCVIS,data=training, family=binomial(link="logit"))

   prediction.working= round(predict(pooled,newdata=testing,type="response"))

   confusionMatrix(prediction.working,testing$WORKING) # Accuracy between both

Кроме того, я хотел бы проделать эту процедуру для случайных эффектов и фиксированных эффектов. Поэтому я сначала безуспешно пробовал случайные эффекты:

   library(glmmML)
   RE <- glmmML(WORKING~WHITEC+FEMALE+BLUEC+HHNINC+AGE+AGESQ+EDUC+DOCVIS, family=binomial(link="logit"), data=training, cluster=id, method="ghq", n.points=12)



    prediction.working= round(predict(RE,newdata=testing,type="response"))

Но, похоже, это не работает. Могу я спросить, как настроить glmmodel относительно случайных эффектов и фиксированных эффектов, чтобы использовать функцию predict.


person Googme    schedule 08.07.2015    source источник
comment
Я думаю, вы ищете условную модель логита. Попробуйте cran.r-project.org/web/packages/mclogit/mclogit .pdf   -  person user227710    schedule 08.07.2015


Ответы (1)


Добро пожаловать в R. Я также конвертирую STATA.

Это сложная проблема, но ее ответ необходимо понять. Чтобы понять, почему функция predict не работает для glmmML, вам необходимо разбираться в методах S3 (см. http://adv-r.had.co.nz/OO-essentials.html).

Позвольте мне немного объяснить. R - объектно-ориентированный язык. Это означает, что все в R является объектом (то есть вектором, функцией, data.frame). Каждый объект содержит атрибуты. Атрибут - это, по сути, метаданные о самом объекте. Например, имена переменных в data.frame являются атрибутами. Один атрибут, который есть у всех объектов, - это класс. Чтобы увидеть класс любого объекта, просто вызовите функцию class().

Многие, но не все функции используют методы S3. Функция predict - одна из этих функций. Это означает, что когда вы вызываете predict, функция predict смотрит на класс объекта. Затем, в зависимости от выбранного класса, следует использовать другую функцию прогнозирования. Например, если ваш объект относится к классу lm, функция прогнозирования вызовет функцию predict.lm. К другим predict функциям относятся: predict.glm для объектов класса glm, predict.loess для объектов класса loess, predict.nls для объектов класса nls и т. Д. (Полный список см. В справке predict). К сожалению, predict.glmmML функции не существует. Следовательно, когда вы вызываете функцию predict для объекта класса glmmML, вы получаете ошибку.

id <- factor(rep(1:20, rep(5, 20)))
y <- rbinom(100, prob = rep(runif(20), rep(5, 20)), size = 1)
x <- rnorm(100)
dat <- data.frame(y = y, x = x, id = id)
fit.2 <- glmmML(y ~ x, data = dat, cluster = id)
predict(fit.2)
Error in UseMethod("predict") : 
  no applicable method for 'predict' applied to an object of class "glmmML"
class(fit.2)
 [1] "glmmML"

Ошибка очень информативная. В основном это говорит о том, что R пытался использовать методы S3, однако не было 'predic.glmmML'

А как насчет функции mclogit, которую предлагает user227710. Давайте посмотрим

data(Transport)

fit <- mclogit(
  cbind(resp,suburb)~distance+cost,
  data=Transport
)

class(fit)
[1] "mclogit" "lm"

Класс fit - это mclogit и lm. Будет predict работать? Да! Когда вы вызываете predict(fit), функция predict сначала ищет predict.mclogit, которого не существует. Затем он будет искать predict.lm. Который действительно существует.

person Jacob H    schedule 08.07.2015
comment
Спасибо за предложение. Согласно инструкции mclogit, можно просто указать случайные эффекты. Могу я спросить, как с помощью этой библиотеки определить прогноз фиксированных эффектов? Спасибо - person Mamba; 09.07.2015
comment
Кроме того, необходимо создать счетчик ответов, как предложено в вашем примере, с помощью cbind(resp,suburb) - person Googme; 09.07.2015