如何在 Matlab 中创建程序来计算 Hat 矩阵的 Hii
How to create a program in Matlab to compute the Hii of the Hat matrix
谁能帮我计算 Hii 矩阵
它应该得到一个单一的值。
但是,在我的代码中,它显示为 2x2 矩阵。
这是我在 Matlab 中的代码:
faithfuldat = xlsread('faithful.csv');
save faithful.mat faithfuldat % command form
[N,dim]=size(faithfuldat);
fData = faithfuldat;
X_ones =[ones(length(fData(:,1)),1) fData(:,1)];
hii = zeros(N);
for i = 1:N
hii(i)=X_ones(i,:)'.*(X_ones'*X_ones).*X_ones(i,:)
end
如果在Matlab中不使用csv文件的代码:
a = [1 20;1 30;1 40]
for i = 1:length(a)
disp(a(i,:)'.*(a'*a).*a(i,:))
end
R 中的代码运行良好:
n <- 50
k <- 2
b0 <- 2
b1 <- 3
x0 <- rep(1,50)
x1 <- rnorm(50)
e <- rnorm(50)
y <- b0 + b1*x1 + e
design.data <- matrix(c(x0,x1), ncol=2, byrow=F)
hii <- numeric()
for(j in 1:n){
hii[j] <- t(design.data[j,]) %*% solve(t(design.data)%*%design.data) %*% matrix(design.data[j,])
}
结果:
[1] 0.03400676 0.05641070 0.04553599 0.05094598 0.02047051 0.08695448 0.10619427 0.02375806 0.02633310 0.02397181 0.02502073 0.02974964 0.02450914 0.02973598 0.02074476 0.02040370
[17] 0.02659910 0.06028877 0.02028375 0.02121156 0.02727598 0.03565958 0.07047492 0.03275287 0.02680609 0.05062417 0.06499097 0.02712547 0.02000748 0.06958282 0.02309955 0.02000024
[33] 0.02278708 0.02289988 0.05388652 0.02394204 0.03543398 0.09602045 0.02398702 0.02824829 0.03135704 0.06346209 0.02002556 0.10706917 0.05999023 0.02174539 0.04032562 0.05597862
[49] 0.03750268 0.03380938
任何人都可以建议我如何改进我在 Matlab 中的代码,以便我可以获得 R 代码中产生的结果。
参考你的代码
a = [1 20;1 30;1 40]
for i = 1:length(a)
disp(a(i,:)'.*(a'*a).*a(i,:))
end
有几个问题:
- Matlab 中的矩阵乘积是
*
,不是 .*
。
a(i,:)
是行向量,不是列向量。所以你需要移动转置。
- 转置use
.'
, not '
。运算符 '
是复共轭转置。
- 更好not to use
i
as variable name。
因此,将 thid 行更改为以下内容(另外考虑重命名 i
):
disp(a(i,:)*(a.'*a)*a(i,:).')
谁能帮我计算 Hii 矩阵
它应该得到一个单一的值。 但是,在我的代码中,它显示为 2x2 矩阵。 这是我在 Matlab 中的代码:
faithfuldat = xlsread('faithful.csv');
save faithful.mat faithfuldat % command form
[N,dim]=size(faithfuldat);
fData = faithfuldat;
X_ones =[ones(length(fData(:,1)),1) fData(:,1)];
hii = zeros(N);
for i = 1:N
hii(i)=X_ones(i,:)'.*(X_ones'*X_ones).*X_ones(i,:)
end
如果在Matlab中不使用csv文件的代码:
a = [1 20;1 30;1 40]
for i = 1:length(a)
disp(a(i,:)'.*(a'*a).*a(i,:))
end
R 中的代码运行良好:
n <- 50
k <- 2
b0 <- 2
b1 <- 3
x0 <- rep(1,50)
x1 <- rnorm(50)
e <- rnorm(50)
y <- b0 + b1*x1 + e
design.data <- matrix(c(x0,x1), ncol=2, byrow=F)
hii <- numeric()
for(j in 1:n){
hii[j] <- t(design.data[j,]) %*% solve(t(design.data)%*%design.data) %*% matrix(design.data[j,])
}
结果:
[1] 0.03400676 0.05641070 0.04553599 0.05094598 0.02047051 0.08695448 0.10619427 0.02375806 0.02633310 0.02397181 0.02502073 0.02974964 0.02450914 0.02973598 0.02074476 0.02040370
[17] 0.02659910 0.06028877 0.02028375 0.02121156 0.02727598 0.03565958 0.07047492 0.03275287 0.02680609 0.05062417 0.06499097 0.02712547 0.02000748 0.06958282 0.02309955 0.02000024
[33] 0.02278708 0.02289988 0.05388652 0.02394204 0.03543398 0.09602045 0.02398702 0.02824829 0.03135704 0.06346209 0.02002556 0.10706917 0.05999023 0.02174539 0.04032562 0.05597862
[49] 0.03750268 0.03380938
任何人都可以建议我如何改进我在 Matlab 中的代码,以便我可以获得 R 代码中产生的结果。
参考你的代码
a = [1 20;1 30;1 40]
for i = 1:length(a)
disp(a(i,:)'.*(a'*a).*a(i,:))
end
有几个问题:
- Matlab 中的矩阵乘积是
*
,不是.*
。 a(i,:)
是行向量,不是列向量。所以你需要移动转置。- 转置use
.'
, not'
。运算符'
是复共轭转置。 - 更好not to use
i
as variable name。
因此,将 thid 行更改为以下内容(另外考虑重命名 i
):
disp(a(i,:)*(a.'*a)*a(i,:).')