我正在运行一个完全相互作用的线性回归(也就是说,我包括所有变量的所有双向交互),现在我想输出变量名和系数估计值。 最小的例子如下:
y = randn(100,1); %Dependent variable
X = randn(100,3); %Independent variables
names = {'var1', 'var2', 'var3'};
Xint = x2fx(X, 'interaction'); %Construct interaction terms
res = regstats(y,Xint);
现在,x2fx()的文档声明它按以下顺序构造其输出:
常数
线性项(X列,依次为1,2,...,n)
交互术语(X列的成对乘积,顺序为(1,2),(1,3),...,(1,n),(2,3),...,( n-1,n))
我现在想要以相同的顺序构造一个变量名称的单元格,即(对于最小的例子)我想要
allVars = {'cons', 'var1', 'var2', 'var3','var1xvar2','var1xvar3','var2xvar3'};
我尝试使用ndgrid执行此操作,如下所示:
temp1 = 1:3; % Vector of variable indices
[x, y] = ndgrid(temp1, temp1);
allvarnames = [x(:) y(:)];
但这有两次相互作用的变量(例如一次为2-1,一次为1-2),顺序仍然是错误的。我可以按照这些方针进行,虽然它可能有些混乱,但我想知道是否有人知道更简单的解决方案。
提前致谢, 汤姆
答案 0 :(得分:1)
也许使用triu(上三角矩阵)?
T = triu(ones(length(names))); %a mask for cross terms to keep
for i = 1:length(names)
for j = 1:length(names)
if T(i,j) && (i ~= j)
fprintf('%sx%s\n',names{i},names{j});
end
end
end
这只是印刷了交叉术语;您必须将它们保存到allvarnames数组中,并使用常量和线性项变量名称前置。
var1xvar2
var1xvar3
var2xvar3
请注意,无论名称的长度如何,这都有效。'