Как воспроизвести поля Stata в R после lm ()

От Статы:

margins, at(age=40)

Чтобы понять, почему это дает желаемый результат, позвольте нам сказать вам это, если вы наберете. Margins Margins будет отражать общую маржу - маржу, которая не содержит ничего постоянного. Поскольку наша модель является логистической, будет указано среднее значение прогнозируемых вероятностей. Параметр at () фиксирует одну или несколько ковариат для указанного значения (значений) и может использоваться как с факторными, так и с непрерывными переменными. Таким образом, если вы набрали

margins, at(age=40)

тогда поля будут усреднены по данным ответов для всех, установив возраст = 40.

Может ли кто-нибудь помочь мне, какой пакет может быть полезен? Я уже пытался найти среднее значение предсказанных значений для данных подмножества, но это не работает для последовательностей, например полей, в (age = 40 (1) 50).


person Nata107    schedule 24.08.2016    source источник


Ответы (1)


Есть много способов получить маргинальный эффект в R.

Вы должны понимать, что margins, at Stata - это просто предельные эффекты, оцениваемые в средних или репрезентативных точках (см. это и документацию).

Думаю, вам больше всего понравится это решение, так как оно больше всего похоже на то, к чему вы привыкли:

library(devtools)
install_github("leeper/margins")

Источник: https://github.com/leeper/margins

margins - это попытка перенести команду margins из Stata (закрытый исходный код) в R в качестве универсального метода S3 для расчета предельных эффектов (или «частичных эффектов») ковариат, включенных в объекты модели (например, классов «lm» и «glm» ). Метод построения графика для нового класса "margins" дополнительно переносит команду marginsplot.

library(margins)
x <- lm(mpg ~ cyl * hp + wt, data = mtcars)
(m <- margins(x))
     cyl       hp       wt 
 0.03814 -0.04632 -3.11981

См. Также команду prediction (?prediction) в этом пакете.

Помимо этого, я собрал еще несколько решений:

I. erer (упаковка)

maBina() command

http://cran.r-project.org/web/packages/erer/erer.pdf

II. mfxboot

mfxboot <- function(modform,dist,data,boot=1000,digits=3){
  x <- glm(modform, family=binomial(link=dist),data)
  # get marginal effects
  pdf <- ifelse(dist=="probit",
                mean(dnorm(predict(x, type = "link"))),
                mean(dlogis(predict(x, type = "link"))))
  marginal.effects <- pdf*coef(x)
  # start bootstrap
  bootvals <- matrix(rep(NA,boot*length(coef(x))), nrow=boot)
  set.seed(1111)
  for(i in 1:boot){
    samp1 <- data[sample(1:dim(data)[1],replace=T,dim(data)[1]),]
    x1 <- glm(modform, family=binomial(link=dist),samp1)
    pdf1 <- ifelse(dist=="probit",
                   mean(dnorm(predict(x, type = "link"))),
                   mean(dlogis(predict(x, type = "link"))))
    bootvals[i,] <- pdf1*coef(x1)
  }
  res <- cbind(marginal.effects,apply(bootvals,2,sd),marginal.effects/apply(bootvals,2,sd))
  if(names(x$coefficients[1])=="(Intercept)"){
    res1 <- res[2:nrow(res),]
    res2 <- matrix(as.numeric(sprintf(paste("%.",paste(digits,"f",sep=""),sep=""),res1)),nrow=dim(res1)[1])
    rownames(res2) <- rownames(res1)
  } else {
    res2 <- matrix(as.numeric(sprintf(paste("%.",paste(digits,"f",sep=""),sep="")),nrow=dim(res)[1]))
    rownames(res2) <- rownames(res)
  }
  colnames(res2) <- c("marginal.effect","standard.error","z.ratio")
  return(res2)}

Источник: http://www.r-bloggers.com/probitlogit-marginal-effects-in-r/

III. Источник: Предельные эффекты регрессии R probit

x1 = rbinom(100,1,.5)
x2 = rbinom(100,1,.3)
x3 = rbinom(100,1,.9)
ystar = -.5  + x1 + x2 - x3 + rnorm(100)
y = ifelse(ystar>0,1,0)
probit = glm(y~x1 + x2 + x3, family=binomial(link='probit'))
xbar <- as.matrix(mean(cbind(1,ttt[1:3])))

Теперь графика, то есть предельное влияние x1, x2 и x3

library(arm)
curve(invlogit(1.6*(probit$coef[1] + probit$coef[2]*x + probit$coef[3]*xbar[3] + probit$coef[4]*xbar[4]))) #x1
curve(invlogit(1.6*(probit$coef[1] + probit$coef[2]*xbar[2] + probit$coef[3]*x + probit$coef[4]*xbar[4]))) #x2
curve(invlogit(1.6*(probit$coef[1] + probit$coef[2]*xbar[2] + probit$coef[3]*xbar[3] + probit$coef[4]*x))) #x3

library(AER)
data(SwissLabor)
mfx1 <- mfxboot(participation ~ . + I(age^2),"probit",SwissLabor)
mfx2 <- mfxboot(participation ~ . + I(age^2),"logit",SwissLabor)
mfx3 <- mfxboot(participation ~ . + I(age^2),"probit",SwissLabor,boot=100,digits=4)

mfxdat <- data.frame(cbind(rownames(mfx1),mfx1))
mfxdat$me <- as.numeric(as.character(mfxdat$marginal.effect))
mfxdat$se <- as.numeric(as.character(mfxdat$standard.error))


# coefplot
library(ggplot2)
ggplot(mfxdat, aes(V1, marginal.effect,ymin = me - 2*se,ymax= me + 2*se)) +
  scale_x_discrete('Variable') +
  scale_y_continuous('Marginal Effect',limits=c(-0.5,1)) +
  theme_bw() +
  geom_errorbar(aes(x = V1, y = me),size=.3,width=.2) +
  geom_point(aes(x = V1, y = me)) +
  geom_hline(yintercept=0) +
  coord_flip() +
  opts(title="Marginal Effects with 95% Confidence Intervals")
person Hack-R    schedule 24.08.2016
comment
да, но не предельные эффекты, а прогнозные пределы, то есть прогнозы при изменении одного x при неизменных других параметрах .... - person Nata107; 24.08.2016
comment
@ Nata107 Если вам известны частичные (предельные) эффекты, вы знаете, как их рассчитать. Это дает вам уравнение для этого. Вы можете установить значения для прогнозов, как вам нравится, и использовать одну из моделей выше с оператором predict или вычислить его напрямую. Я не уверен, что связано с этим, что команда margins дает вам, а порт команды margins - нет? Вы видели в этом пакете команду prediction? - person Hack-R; 24.08.2016
comment
это похоже на команду предсказать, не позволяет использовать подмножество или конкретное значение для x - person Nata107; 24.08.2016
comment
сейчас я использую for (i in 5:17) {new ‹-subset (newdata, x1 == i, select = c (x2, x3, xn)) print (mean (pred.lm (newreg1, new)) )}, но это не очень удобно - person Nata107; 24.08.2016
comment
а для полей atmeans: xxdata ‹- data.frame (x1 = c (5:17), x2 = mean (newdata $ x2), ...) kar‹ -predict.lm (newreg1, xxdata) - person Nata107; 24.08.2016
comment
Просто интересно, есть ли что-то более простое и удобное - person Nata107; 24.08.2016
comment
На III. Я получаю Error in cbind(1, ttt[1:3]) : object 'ttt' not found. - person jay.sf; 30.12.2018
comment
@ jay.sf Привет, да, вы получите эту ошибку, если просто запустите фрагменты кода из ответа, потому что объект не был создан там. Пожалуйста, перейдите по ссылке, чтобы увидеть, где он создан. - person Hack-R; 30.12.2018
comment
Спасибо, однако связанный вопрос не воспроизводится. Просто интересно, как в конечном итоге получить сюжет с вашим кодом. - person jay.sf; 30.12.2018