楼主: 烟草味99
7447 10

[问答] 新人求助,如何使用R软件模拟probit模型数据?悬赏1500币,满意可以追加。 [推广有奖]

11
rosenbloog 发表于 2020-3-28 08:48:27
问题在于仿真出来的y均值太大,导致它变成0-1变量时取0值的样本量太少。这样的y跟x交互之后的列联表长这样:

y=0

y=1

x=0

54

6628

x=1

2

3316



可想而知,这样的数据分布对计算机的参数估计来说挑战非常大;即使x和y相关,计算机也算不出来。一般来说,每个单元格的占比不应少于总样本的5%。

解决问题的办法也比较简单,就是把y的均值调小,让x和y的分布更均衡些。具体见下面的code:

  1. ### 第零步
  2. set.seed(129)
  3. g1=rbinom(10000, 1, 0.9)
  4. c1=rnorm(10000, mean=10, sd=2)
  5. c2=rbinom(10000, 2, 0.4)
  6. u=rnorm(10000, mean = 10, sd = 2)
  7. exi=rnorm(10000, mean = 0, sd = 1)
  8. eyi=rnorm(10000, mean = 0, sd = 1)


  9. ### 第一步
  10. probit_x=0.3*g1+0.2*c1-0.3*c2+u+exi-13
  11. probit_data=as.data.frame(cbind(g1,c1,c2,u,probit_x))
  12. probit_data$x[probit_x>0]=1
  13. probit_data$x[probit_x<=0]=0

  14. anorex.1 <- glm(x~g1+c1+c2+u,
  15.                 family=binomial(link = "probit"),data =probit_data)
  16. summary(anorex.1)


  17. ### 第二步
  18. x <- probit_data$x             # x为0/1变量
  19. probit_y=0.3*x+2*c1-4*c2+u+eyi-25          # 把mean搞对
  20. # probit_y=0.3*x+2*c1-4*c2+u+eyi-13       # 原均值大大超过了0:20-4+10+0-13 = 14

  21. # hist(probit_y)
  22. # table(probit_y>0)
  23. # probit_data$probit_y = NULL
  24. # probit_data$y = NULL

  25. probit_data=as.data.frame(cbind(probit_data,probit_y))
  26. probit_data$y[probit_data$probit_y>0]=1
  27. probit_data$y[probit_data$probit_y<=0]=0

  28. # table(probit_data$x, probit_data$y)           # 问题在这:y取0值的样本量太小

  29. anorex.2 <- glm(y~x+c1+c2+u,
  30.                 family=binomial(link = "probit"),data =probit_data)
  31. summary(anorex.2)
复制代码


已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 60 + 3 + 3 + 3 精彩帖子

总评分: 论坛币 + 60  学术水平 + 3  热心指数 + 3  信用等级 + 3   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 03:32