如何将p值矩阵绘制成直方图

时间:2016-02-04 14:51:24

标签: matrix histogram stata p-value

我一直在网上搜索如何绘制存储在矩阵中的值的直方图,但我在这方面遇到了一些麻烦。我创建了一个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值?

2 个答案:

答案 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 

此代码中没有:

  1. 出于任何目的,不需要将结果放入本地和/或矩阵和/或将其取出。我们将它们直接放入变量中,因为这是所需的结果。

  2. 观察数字_n不用于任何东西,所以它们看起来也是可有可无的,尽管它们可能需要你真正的问题。

  3. 您的评论store the mean与您尝试的任何代码都不匹配。

  4. 另请注意,将local作为变量的讨论对于熟悉其他编程语言的人来说是很自然的,但在任何意义上都不是Stata术语。本地是本地宏,而不是变量。

答案 1 :(得分:0)

Stata的主数据集,您使用matrix命令和Mata矩阵访问的矩阵都是独立存在的,需要单独的函数来处理,但您可以在这三个数据之间传输数据。

在您的情况下,您希望将Mata矩阵加载到Stata数据集中,您可以执行以下操作:

clear
getmata pvalue1000, double

请注意,您的p值非常小,因此您需要使用double选项。否则,您将获得单精度的零。