R矩阵和浮点和保证金误差

时间:2017-11-16 22:19:36

标签: r anova

我有这些数据:

b=[[[5, 6], [7, 8]]]

我正在对数据运行ANOVA,并找到我正在执行以下操作的参数:

计算方法:

   SEX LS  GPA
1    M DO 2.56
2    M DO 2.70
3    M DO 3.04
4    M DO 1.42
5    M FS 3.02
6    M FS 2.67
7    M FS 2.35
8    M FS 1.80
9    M CO 3.41
10   M CO 2.97
11   M CO 2.23
12   M CO 2.31
13   M AP 2.28
14   M AP 3.73
15   M AP 2.05
16   M AP 2.61
17   M HO 2.57
18   M HO 2.81
19   M HO 3.01
20   M HO 3.40
21   F DO 3.33
22   F DO 1.80
23   F DO 2.50
24   F DO 3.04
25   F FS 3.87
26   F FS 3.00
27   F FS 3.25
28   F FS 2.76
29   F CO 3.14
30   F CO 4.00
31   F CO 2.66
32   F CO 2.91
33   F AP 3.69
34   F AP 2.55
35   F AP 3.21
36   F AP 2.86
37   F HO 3.09
38   F HO 1.99
39   F HO 3.46
40   F HO 3.61

计算加性效应

mu_grand <- mean(data$GPA)
mu_alpha <- aggregate(data$GPA,list(data$SEX),mean)$x
mu_beta <- aggregate(data$GPA,list(data$LS),mean)$x
mu_alpha_beta <- matrix(aggregate(data$GPA,list(data$SEX,data$LS),mean)$x,nrow=2)

计算互动效果

alpha <- mu_alpha - mu_grand
beta <- mu_beta - mu_grand

这是alpha_beta:

a1 <- rep(alpha[1],length(beta))
a2 <- rep(alpha[2],length(beta))

ab1 <- a1 + beta
ab2 <- a2 + beta

ab <- rbind(ab1,ab2)

alpha_beta <- mu_alpha_beta - (mu_grand + ab)

如果我想找到alpha_beta的总和我

ab1  0.0105  0.02925 -0.07575  0.1855 -0.1495
ab2 -0.0105 -0.02925  0.07575 -0.1855  0.1495

虽然这绝对是浮点精度,但我想知道为什么有任何错误,如果你只是手动将所有数字加起来得到0?谢谢!

1 个答案:

答案 0 :(得分:0)

看那个数字它非常小。 R仅计算到大约15位数,因此这只是舍入误差。使用包gmp,我们可以看到物理定律没有被破坏。

加载必需的包

require("gmp") #Required package

读入数据

data<- read.table(text="SEX LS  GPA
1    M DO 2.56
                  2    M DO 2.70
                  3    M DO 3.04
                  4    M DO 1.42
                  5    M FS 3.02
                  6    M FS 2.67
                  7    M FS 2.35
                  8    M FS 1.80
                  9    M CO 3.41
                  10   M CO 2.97
                  11   M CO 2.23
                  12   M CO 2.31
                  13   M AP 2.28
                  14   M AP 3.73
                  15   M AP 2.05
                  16   M AP 2.61
                  17   M HO 2.57
                  18   M HO 2.81
                  19   M HO 3.01
                  20   M HO 3.40
                  21   F DO 3.33
                  22   F DO 1.80
                  23   F DO 2.50
                  24   F DO 3.04
                  25   F FS 3.87
                  26   F FS 3.00
                  27   F FS 3.25
                  28   F FS 2.76
                  29   F CO 3.14
                  30   F CO 4.00
                  31   F CO 2.66
                  32   F CO 2.91
                  33   F AP 3.69
                  34   F AP 2.55
                  35   F AP 3.21
                  36   F AP 2.86
                  37   F HO 3.09
                  38   F HO 1.99
                  39   F HO 3.46
                  40   F HO 3.61", header=T,row.names=1)

<强>代码

data$GPA<-as.bigq(data$GPA) #Converts to class `bigq`

#Special function because sapply was converting data to raw format
meanL<-function(L){ 
  x<-rep(0,length(L))
  x<-as.bigq(x)

  for(i in 1:length(L)){
    x[i]<-mean(L[[i]])
  }
  return(x)
}

#This section is changed to handle the new class `bigq`
mu_grand <- mean(data$GPA)
mu_alpha <- meanL(split(data$GPA,data$SEX))
mu_beta <- meanL(split(data$GPA,data$LS))
mu_alpha_beta <- matrix(meanL(split(data$GPA,as.factor(paste(data$SEX,data$LS,sep="-")))),nrow=2)



alpha <- mu_alpha - mu_grand
beta <- mu_beta - mu_grand

a1 <- rep(alpha[1],length(beta))
a2 <- rep(alpha[2],length(beta))

ab1 <- a1 + beta
ab2 <- a2 + beta

ab<-matrix(c(ab1,ab2),ncol=5,byrow=T) #The same as rbind but needed to work with objects of class 'bigq'.
alpha_beta <- mu_alpha_beta - (mu_grand + ab)
sum(alpha_beta)

Big Rational ('bigq') :
[1] 0

这是一个很好的思想实验,但是gmp的工作很痛苦,因为你可以看到像aggregatesapply这样的功能不能很好地发挥作用它。当你看到令人难以置信的小数字,即1e-16并且你期望为0时,你可以假设它们是0。