如何将 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 值,就像所有以前的化身一样pval
的 clear
被您自己的代码排除了。 (将直方图命令 放在 循环中在这里不会产生任何有用的效果,因为变量内部最多只有一个 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
此代码中没有的内容:
将结果放入局部 and/or 矩阵 and/or 再次取出它们对于任何目的都是不需要的。我们直接将它们一一放入一个变量中,因为那是需要的结果。
观察数_n
没有任何用处,因此它们似乎也是可有可无的,尽管对于您的实际问题自然可能需要它们。
您的评论 store the mean
与您尝试的任何代码都不匹配。
另请注意,对于熟悉其他编程语言的任何人来说,将 local
s 作为变量进行讨论是很自然的,但这绝不是 Stata 术语。局部变量是局部宏,而不是变量。
Stata 的主要数据集,您使用 matrix
命令访问的矩阵和 Mata 矩阵都是独立存在的,需要单独的函数来处理,但您可以在所有三者之间传输数据。
在您的情况下,您希望将 Mata 矩阵加载到 Stata 数据集中,您可以按如下方式执行:
clear
getmata pvalue1000, double
请注意,您的 p 值非常小,因此您需要使用 double
选项。否则你会得到单精度的零。
我一直在网上搜索如何绘制存储在矩阵中的值的直方图,但我在这样做时遇到了一些问题。我创建了一个 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 值,就像所有以前的化身一样pval
的 clear
被您自己的代码排除了。 (将直方图命令 放在 循环中在这里不会产生任何有用的效果,因为变量内部最多只有一个 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
此代码中没有的内容:
将结果放入局部 and/or 矩阵 and/or 再次取出它们对于任何目的都是不需要的。我们直接将它们一一放入一个变量中,因为那是需要的结果。
观察数
_n
没有任何用处,因此它们似乎也是可有可无的,尽管对于您的实际问题自然可能需要它们。您的评论
store the mean
与您尝试的任何代码都不匹配。
另请注意,对于熟悉其他编程语言的任何人来说,将 local
s 作为变量进行讨论是很自然的,但这绝不是 Stata 术语。局部变量是局部宏,而不是变量。
Stata 的主要数据集,您使用 matrix
命令访问的矩阵和 Mata 矩阵都是独立存在的,需要单独的函数来处理,但您可以在所有三者之间传输数据。
在您的情况下,您希望将 Mata 矩阵加载到 Stata 数据集中,您可以按如下方式执行:
clear
getmata pvalue1000, double
请注意,您的 p 值非常小,因此您需要使用 double
选项。否则你会得到单精度的零。