楼主: xuqin4001
862 10

[一般统计问题] 能帮我看看哪里出错了吗?反复报错 [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

大专生

60%

还不是VIP/贵宾

-

威望
0
论坛币
735 个
通用积分
0.0004
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
174 点
帖子
9
精华
0
在线时间
121 小时
注册时间
2017-8-26
最后登录
2024-5-31

楼主
xuqin4001 发表于 2023-4-16 00:31:33 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我发现问题出在matrix X=J()这部分,反复报错,请问大家知道怎么修改吗?我想生成全为1的列矩阵作为X0和beta0相乘
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:哪里出错了 matrix beta 怎么修改 Mat stata 数据处理 矩阵

E3B4DA91-0823-4C81-B1E2-BE60C8C92B41.png (581.21 KB)

E3B4DA91-0823-4C81-B1E2-BE60C8C92B41.png

沙发
蓝色 发表于 2023-4-16 08:40:50
不要贴图片,别人很难尝试
难道让想帮你的人在自己输入一遍代码吗

直接贴出文本格式的代码,直接拷贝黏贴就可以测试哪里问题了

藤椅
xuqin4001 发表于 2023-4-16 09:03:55
蓝色 发表于 2023-4-16 08:40
不要贴图片,别人很难尝试
难道让想帮你的人在自己输入一遍代码吗
好的谢谢你!我立刻把代码附上

板凳
xuqin4001 发表于 2023-4-16 09:04:22

clear

set seed 12345

local n = 100

local R = 1000

matrix true_beta = (1, 0, -1, 3)'

matrix bias_beta = J(4, 1, .)

matrix sd_beta = J(4, 1, .)

matrix rmse_beta = J(4, 1, .)

forvalues i = 1/`R' {

    // Generate data

    set seed `i'

    matrix x1 = rnormal(`n', 0, 1)

    matrix x2 = runiform(`n', -1, 1)

    matrix x3 = rnormal(`n', 0, sqrt(2))

    matrix X = J(`n', 1, 1) \ x1 \ x2 \ x3

    matrix e = rnormal(`n', 0, 1)

    matrix y = X * true_beta + e

    // OLS estimation

    qui reg y x1 x2 x3

    matrix b_hat = e(b)

    // Calculate bias, standard deviation, and RMSE

    matrix bias_beta = (bias_beta*(i-1) + (b_hat - true_beta))/i

    matrix sd_beta = (sd_beta*(i-1) + (b_hat - mean(b_hat)))/i

    matrix rmse_beta = (rmse_beta*(i-1) + (b_hat - true_beta)^2)/i

}

matrix table = (bias_beta, sd_beta, sqrt(rmse_beta))

matlist table, format(%9.3f) title("Table 1: OLS estimation over 1000 repetitions")

报纸
xuqin4001 发表于 2023-4-16 09:06:07
clear
set seed 12345
local n = 100
local R = 1000
matrix true_beta = (1, 0, -1, 3)'
matrix bias_beta = J(4, 1, .)
matrix sd_beta = J(4, 1, .)
matrix rmse_beta = J(4, 1, .)

forvalues i = 1/`R' {
    // Generate data
    set seed `i'
    matrix x1 = rnormal(`n', 0, 1)
    matrix x2 = runiform(`n', -1, 1)
    matrix x3 = rnormal(`n', 0, sqrt(2))
    matrix X = J(`n', 1, 1) \ x1 \ x2 \ x3
    matrix e = rnormal(`n', 0, 1)
    matrix y = X * true_beta + e

    // OLS estimation
    qui reg y x1 x2 x3
    matrix b_hat = e(b)

    // Calculate bias, standard deviation, and RMSE
    matrix bias_beta = (bias_beta*(i-1) + (b_hat - true_beta))/i
    matrix sd_beta = (sd_beta*(i-1) + (b_hat - mean(b_hat)))/i
    matrix rmse_beta = (rmse_beta*(i-1) + (b_hat - true_beta)^2)/i
}

matrix table = (bias_beta, sd_beta, sqrt(rmse_beta))
matlist table, format(%9.3f) title("Table 1: OLS estimation over 1000 repetitions")

地板
蓝色 发表于 2023-4-16 09:23:31
     matrix x1 = rnormal(`n', 0, 1)
    matrix x2 = runiform(`n', -1, 1)
    matrix x3 = rnormal(`n', 0, sqrt(2))
    matrix e = rnormal(`n', 0, 1)

这些函数都不对,你的按照看函数的帮助里面是如何写参数的

7
xuqin4001 发表于 2023-4-16 09:29:32
蓝色 发表于 2023-4-16 09:23
matrix x1 = rnormal(`n', 0, 1)
    matrix x2 = runiform(`n', -1, 1)
    matrix x3 = rnormal(` ...
谢谢!我是想循环100次,每一次随机生成1000组X的数据,最终就可以得到100组beta的值。于是有了这个,其他都能运行,似乎出问题的是X=J(`n',1,1)\x1\x2\x3。因为我的第一个beta0对应的x是一个恒为1的常数。

8
DΘstinyじò 发表于 2023-4-16 11:14:59
xuqin4001 发表于 2023-4-16 09:29
谢谢!我是想循环100次,每一次随机生成1000组X的数据,最终就可以得到100组beta的值。于是有了这个,其他 ...
  1.      matrix x1 = rnormal(`n', 0, 1)
  2.      matrix x2 = runiform(`n', -1, 1)
  3.      matrix x3 = rnormal(`n', 0, sqrt(2))
  4.      matrix e = rnormal(`n', 0, 1)
复制代码
前面蓝色老师说的这块是有点问题的,这些函数最多有两个参数,是不是想这样:
  1. mat x1 = J(`n',1,rnormal())
  2. mat x2=J(`n',1,runiform(-1,1))
  3. mat x3=J(`n',1,rnormal(0,sqrt(2)))
复制代码
你说的mat X 那里,横向并用","  (得到(`n',4)矩阵),纵向并用"\"   (得到(4*`n',1)矩阵)
另外,一直都是矩阵运算,reg y x1 x2 x3,这些现在都是矩阵,不是变量,运行返回为空;
还有一些一致性的问题,比如刚才reg假设运行成功了,得到了e(b),也就是b_hat,这是(4,1)矩阵,到了bias_beta生成那里,true_beta是(1,4)矩阵,不能加减;
还有就是sd_beta生成那里,mean()对矩阵运算好像是不行。
(以上个人意见不一定都正确,只作为参考)

9
Liss_H 学生认证  发表于 2023-4-16 11:20:42
你这样是不行的。无法直接赋值随机数给矩阵。生成随机的矩阵不好弄,生成随机的变量很简单。当然你也可以把变量转化为矩阵,但没必要。
而且你每次循环完之后,把结果储存那里,每次循环都会覆盖原来的结果,无法达到你的目的。

我给你提供一段做蒙塔卡洛模拟的代码,你稍微调整一下,看看是否符合你的需要。
主要是用的是自带的simulate命令。
help simulate

  1. clear

  2. // generate true data
  3. drop _all

  4. set obs 100
  5. set seed 54321
  6. gen x1 = rnormal()
  7. gen x2 = rnormal()
  8. gen x3 = rnormal()
  9. gen true_y = 1 + 1*x1 + 0.2*x2 - 1*x3 + 3*rnormal()
  10. save truth.dta, replace


  11. set seed 123
  12. cap program drop mc_reg
  13. program mc_reg
  14.   version 13
  15.   args c
  16.   capture drop y
  17.   gen y = true_y + (`c' * rnormal())
  18.   regress y x1 x2 x3
  19. end

  20. local c 5 // more heterogenity for bigger c
  21. simulate _b _se, reps(1000): mc_reg `c'
  22. describe *
  23. su
复制代码

10
xuqin4001 发表于 2023-4-16 14:44:37
Liss_H 发表于 2023-4-16 11:20
你这样是不行的。无法直接赋值随机数给矩阵。生成随机的矩阵不好弄,生成随机的变量很简单。当然你也可以把 ...
谢谢你。不过,请问:为什么这段代码无法运行呢?:simulate _b _se, reps(1000): mc_reg `c'

会显示  :version is not a valid command name
an error occurred when simulate executed mc_reg

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

本版微信群
加好友,备注jltj
拉您入交流群
GMT+8, 2026-1-8 06:19