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

How to plot a matrix of p-values into a histogram

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

histogram 需要一个变量名,而你首先给它输入一个矩阵名,所以不要去那里,因为 Stata 中的矩阵和变量是完全不同的。

相反,当您随后为其提供一个变量名时,您的变量 pval 仅包含放入其中的单个和最后一个 P 值,就像所有以前的化身一样pvalclear 被您自己的代码排除了。 (将直方图命令 放在 循环中在这里不会产生任何有用的效果,因为变量内部最多只有一个 P 值时间。)

矩阵可能非常有用,但它们充其量只是间接用于此目的。

想必你的问题不是你真正的问题。如果您有来自 (0, 1) 上制服的大小为 1000 的样本,则样本均值将全部接近 0.5,并且均值为 0.2 的测试的 P 值将全部实际上与 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. 将结果放入局部 and/or 矩阵 and/or 再次取出它们对于任何目的都是不需要的。我们直接将它们一一放入一个变量中,因为那是需要的结果。

  2. 观察数_n没有任何用处,因此它们似乎也是可有可无的,尽管对于您的实际问题自然可能需要它们。

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

另请注意,对于熟悉其他编程语言的任何人来说,将 locals 作为变量进行讨论是很自然的,但这绝不是 Stata 术语。局部变量是局部宏,而不是变量。

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

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

clear
getmata pvalue1000, double

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