我在 R 中进行了编码,如下所示,
data1<-c(25,35,60,79,50)
data2<-c(100,150,170,200,1000)
g1=sort(data1)
g2=sort(data2)
ybar1<-mean(g1)
ybar2<-mean(g2)
#BIWEIGHT
med1=median(g1)
med2=median(g2)
mad1=1.4826*(median(abs(g1-med1)))
mad2=1.4826*(median(abs(g2-med2)))
u1=(g1-med1)/(9*mad1)
u2=(g2-med2)/(9*mad2)
#cat("\nu1:",u1)
u=rbind(u1,u2)
print(u)
abs=abs(u)
print(abs)
for(j in abs){
if(j < 1){
num1 = ((g1-med1)^2)*((1-(u1^2))^4)
den1 = ((1-(u1^2))*(1-5*(u1^2)))
num2 = ((g2-med2)^2)*((1-(u2^2))^4)
den2 = ((1-(u2^2))*(1-5*(u2^2)))
}
}
cat("\num2:",num2)
但是当我手动计算时,对于 data1,每个值 u1 都小于 1,因此编码与我的手动计算是正确的,但是对于 data2,它包含大于 1 的 u2 值。谁能帮我弄清楚为什么发生以及如何解决?先感谢您。
在我看来,问题是在if
条件内(因此也在for
循环内),您总是采用整个向量(g1
, g2
, u1
, u2
)。您不会告诉 R仅使用g1 和 g2 中 j<1 的那些值。而是使用整个向量多次有值的abs
是<1。
此外,您将u1
和组合u2
为一个 2 行矩阵,但将 g1 和 g2 分开。这令人困惑,并且会给您带来更多问题。我建议你为两个向量做单独的循环。
你可以这样做:
idx1 <- which(abs(u1) < 1) #Gives you the indexes/positions in vector u1, where abs(u1)<1 is TRUE
idx2 <- which(abs(u2) < 1) #same for u2
for(i in idx1){
num1[i] = ((g1[i]-med1)^2)*((1-(u1[i]^2))^4)
den1[i] = ((1-(u1[i]^2))*(1-5*(u1[i]^2)))
}
for(j in idx2){
num2[j] = ((g2[j]-med2)^2)*((1-(u2[j]^2))^4)
den2[j] = ((1-(u2[j]^2))*(1-5*(u2[j]^2)))
}
这样,num1
并且den1
有 5 个元素,因为 u1 的所有绝对值都 <1。
相比之下,num2
andden2
有 4 个元素,因为 u2 的最后一个值是 ca。2.07.
希望这对您有所帮助。
编辑:忘记将索引 ( [i] and [j]
)添加到num1
/2
和den1
/ 2
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句