我正在比较R中矢量剖面(Subtest结果)的距离和相似度的不同度量,其中大多数都易于计算和/或存在于dist()中。 不幸的是,一个可能有趣并且难以让我自己计算的是 Cattel的Rp 。我在R中找不到它 有人知道这是否已存在? 或者你能帮我写一个函数吗?
Rp的公式(Cattell 1994)是这样的:
(2k-d^2)/(2k + d^2)
其中:
k是大小为n的样本的卡方的中位数;
d是两个配置文件之间(加权= m)差异的总和,
好像:sum(m(x(i)-y(i)))
;
我不知道的一件事是,如何获得那里的卡方中位数
谢谢
没有定义k,我得到的是:
Rp.Cattell <- function(x,y){z <- (2k-(sum(x-y))^2)/(2k+(sum(x-y))^2);return(z)}
矢量示例是:
x <- c(-1.2357,-1.1999,-1.4727,-0.3915,-0.2547,-0.4758)
y <- c(0.7785,0.9357,0.7165,-0.6067,-0.4668,-0.5925)
它们是同一设备的测量,但与不同的身体部位有关。我想说,它们不需要标准化或加权。
答案 0 :(得分:1)
This page给出了k的通用公式,然后使用SAS/IML
给出了一个更彻底的方法,它几乎给出了相同的结果。所以我使用了通用公式,增加了自由度的计算,这导致了这个:
Rp.Cattell <- function(x,y) {
dof <- (2-1) * (length(y)-1)
k <- (1-2/(9*dof))^3
z <- (2*k-sum(sum(x-y))^2)/(2*k+sum(sum(x-y))^2)
return(z)
}
x <- c(-1.2357,-1.1999,-1.4727,-0.3915,-0.2547,-0.4758)
y <- c(0.7785,0.9357,0.7165,-0.6067,-0.4668,-0.5925)
Rp.Cattell(x, y)
# [1] -0.9012083
这个数字看起来有意义吗?
答案 1 :(得分:0)
试图验证这个功能,我现在发现chisquare的中位数是50%概率的chisquare值 - 与随机相关。所以功能应该是:
Rp.Cattell <- function(x,y){
dof <- (2-1) * (length(y)-1)
k <- qchisq(.50, df=dof)
z <- (2k-(sum(x-y))^2)/(2k+(sum(x-y))^2);
return(z)}
虽然之前要对标准化值进行必要,但结果才能正确分配。
所以:
library ("stringr")
# they are centered already
x <- as.vector(scale(c(-1.2357,-1.1999,-1.4727,-0.3915,-0.2547,-0.4758),center=F, scale=T))
y <- as.vector(scale(c(0.7785,0.9357,0.7165,-0.6067,-0.4668,-0.5925),center=F, scale=T))
Rp.Cattell(x, y) -0.584423
现在这听起来很合理 - 还是没有?
答案 2 :(得分:0)
我认为z的计算不正确。
您需要计算平方差的总和。不是差异总和的平方。此外2k中缺少产品运算符。
应该是
z <- (2*k-sum((x-y)^2))/(2*k+sum((x-y)^2))
你同意吗?