我一直在网上搜索如何绘制存储在矩阵中的值的直方图,但我在这方面遇到了一些麻烦。我创建了一个forval
循环,我已经存储了1000个测试试验的p值,我现在想在直方图上绘制这些p值。
/* Loop generating 1000 trials and storing p-values */
mata: pvalue1000 = J(1000,1,.)
forvalues i = 1/1000 {
clear
quiet set obs 1000
gen n = _n
quiet gen A = runiform()
quiet ttest A = 0.20
/*store the mean, in a local variable*/
local pvalue = r(p)
gen pval = r(p)
/*transfer the p-value from the "local" to the matrix */
mata: pvalue1000[`i',1] = `pvalue'
}
mata: pvalue1000
hist pvalue1000
在这种情况下,hist pvalue1000
表示找不到pvalue1000
,当我尝试hist pval
时,它只显示直方图中的一个p值(我是假设这是因为它在循环之外)。
另请注意,矩阵仅存储p值,所有p值存储在单个列(有1000行)中。所以矩阵的大小为1列,1000行。
那么我怎么能用hist
调用一个变量,它会在这个直方图上绘制所有的p值?
答案 0 :(得分:1)
histogram
需要一个变量名,你首先给它一个矩阵名称,所以不要去那里,因为矩阵和变量在Stata中是完全不同的。
相反,当您再为其提供变量名称时,您的变量pval
仅包含其中的单个和最后一个 P - 值,因为{{1}的所有先前版本都是pval
你自己的代码被clear
排除了。 (将直方图命令放在循环中)在这里没有任何有用的效果,因为在变量中一次只有一个 P - 值。)
矩阵可能非常有用,但它们最多只是间接用于此目的。
大概你的问题不是你真正的问题。如果您从(0,1)上的制服得到大小为1000的样本,则样本均为接近0.5且 P - 平均值为0.2的测试值几乎无法区分从0开始,没有直方图有趣或有用。但是这段代码似乎捕捉到了你的意图:
clear
set obs 1000
gen A = .
gen pval = .
quietly forval i = 1/1000 {
replace A = runiform()
ttest A = 0.20
replace pval = r(p) in `i'
}
hist pval
此代码中没有:
出于任何目的,不需要将结果放入本地和/或矩阵和/或将其取出。我们将它们直接放入变量中,因为这是所需的结果。
观察数字_n
不用于任何东西,所以它们看起来也是可有可无的,尽管它们可能需要你真正的问题。
您的评论store the mean
与您尝试的任何代码都不匹配。
另请注意,将local
作为变量的讨论对于熟悉其他编程语言的人来说是很自然的,但在任何意义上都不是Stata术语。本地是本地宏,而不是变量。
答案 1 :(得分:0)
Stata的主数据集,您使用matrix
命令和Mata矩阵访问的矩阵都是独立存在的,需要单独的函数来处理,但您可以在这三个数据之间传输数据。
在您的情况下,您希望将Mata矩阵加载到Stata数据集中,您可以执行以下操作:
clear
getmata pvalue1000, double
请注意,您的p值非常小,因此您需要使用double
选项。否则,您将获得单精度的零。