我正在尝试编写一个循环来对变量列表(class Ticket
{
public DateTime PurchaseDate { get; set; }
public override string ToString()
{
return PurchaseDate.ToShortDateString();
}
}
public static bool BoughtBetween(Ticket ticket, DateTime from, DateTime to)
{
return ticket?.PurchaseDate >= from && ticket.PurchaseDate <= to;
}
)进行单独的t检验,并使用tab1
命令将平均值和p值导出到Excel。现在我的代码看起来像这样:
putexcel
不幸的是,现在我只得到 putexcel set "Ttests.xlsx", sheet("t_test") replace
local n_models: word count `tab1'
forval i=1/`n_models' {
mat T=J(`n_models',4,.)
foreach x of tab1 {
ttest `x', by(var)
mat T[`i',1] = r(mu_1)
mat T[`i',2] = r(mu_2)
mat T[`'i,3] = r(mu_1) - r(mu_2)
mat T[`i',4] = r(p)
}
}
putexcel A1= matrix(T)
的第一个变量的均值/ p值。我做错了什么?
答案 0 :(得分:0)
这不是一个最小,完整或可验证的例子。有关此标准,请参阅https://stackoverflow.com/help/mcve。
tab1
。 of tab1
循环中foreach
是非法的,并且当标点符号错误时,将内容放入矩阵的第三列的指令会被破坏。这来自于释义代码,而不是向我们展示一个能够完成您所说的内容的版本。 所以,关键是要向我们展示符合您所说内容的代码。
所有这一切,你的问题都是概念性的:
更大的交易1 您有两个嵌套循环,在计数器上以及您想要作为响应的变量上。但是你只需要一个循环。你想循环变量,同时提高计数器。或者,您想循环计数器,同时选择另一个变量。你做到这一点并不重要,至少对Stata来说。
更大的交易2 您的代码(我猜是什么)会发生什么?追踪它。假设你的变量数是4.所以,最后一次围绕外循环,你将整个矩阵重置为缺失,然后在内循环中循环变量,每次尝试将每个变量的结果放在第4行你的矩阵(即同一行!)。与您的报告相反,我猜您在电子表格中看到的是 last 变量的结果,而不是第一个。
我认为您希望代码更像这样:
sysuse auto, clear
local tab1 mpg price
local var foreign
putexcel set "Ttests.xlsx", sheet("t_test") replace
local n_models: word count `tab1'
mat T = J(`n_models', 4, .)
tokenize `tab1'
forval i=1/`n_models' {
ttest ``i'', by(`var')
mat T[`i',1] = r(mu_1)
mat T[`i',2] = r(mu_2)
mat T[`i',3] = r(mu_1) - r(mu_2)
mat T[`i',4] = r(p)
}
putexcel A1 = matrix(T)