2012-09-08 75 views
9

我有6列37行的列联表数据矩阵。 我需要应用Chi平方变换来为我提供Row配置文件和Column配置文件以进行对应分析。避免R中嵌套循环的数据转换

不幸的是,我被告知我需要使用嵌套循环来转换数据并执行CA(而不是在R中更明智的做法)。我被赋予了结构,用我的嵌套循环:

transformed.data=data0 

for (row.index in 1:nrow(data)) { 
    for (col.index in 1:ncol(data)) { 
    transfomed.data[row.index,col.index]= 
     "TRANSFORMATION"[row.index,col.index] 
    } 
} 

从我使用嵌套循环明白它将应用我“转型”第一个行,然后到列。

我要上数据以获得该行配置文件完成的转变是:

X(IJ)/总和(X())/SQRT(SUM(X(Ĵ)))

当我想上的数据得到列配置文件完成的改造是:

X(IJ)/总和(X(Ĵ))/SQRT( SUM(X()))

我会为我的“TRANSFO进入什么RMATION“在嵌套循环的最后一行中,让它为配置文件输出我想要的转换。否则,如果我没有理解这里的嵌套循环的要点,请描述它会允许我做什么。

这是我的数据子集的代码:

matrix(c(15366,2079,411,366,23223,2667,699,819,31632,2724,717,1473,49938,3111,1062,11964) 
,nrow=4,ncol=4,byrow=T) 

因此,使用这个子集单独我预计该行配置文件的第一行是:

0.002432689 0.0003291397 6.506803e-05 5.794379e-05 

和列第一列的配置文件为:

0.0009473414, 0.0132572344, 0.0572742202, 0.0132863528 
+0

你可以添加一些样本数据,使您的问题[重复性(HTTP:/ /stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)?输入数据集和您的预期结果将是必要的。此外,您是否搜索过构建函数?谷歌的第一次打击给了我[这](http://www.statmethods.net/advstats/ca.html)。 – Chase

+0

谢谢Chase,我会在第一篇文章中添加一些示例数据。关于这个任务的第二个问题,我必须首先通过变换数据(我坚持的那一点)并对其做一个PCA来逐步进行对应分析,然后通过对角线做更合理的方法(原始数据)和ca(原始数据) – Confused

+0

听起来像功课吗?几条建议。 1)你不需要任何for循环,2)如果你使用'colSums()'和'rowSums()'3),当你的公式失败时,你的公式可以变得更容易,你可以看看函数的源代码看看其他作者如何解决这个相同的问题。为此,在控制台中输入没有parens的函数名称。这*可以*是与上述信息的单行功能。 – Chase

回答

1

您可以在这些类型的计算中使用此功能,而无需甚至需要一个循环。重写你的公式,然后你会得到:

Xtrans [I,J] = X [I,J]/总和(X [我])* SQRT(SUM(X [,J]))

要获得代表任期矩阵 - 总和(X [我])* SQRT(SUM(X [,J])) - 您使用功能outer()%o%像这样:

rowSums(X) %o% sqrt(colSums(X)) 

或者,列转型:

sqrt(rowSums(X)) %o% colSums(X) 

你需要做的唯一的事情,是这一个将您的原始矩阵,例如用于山坳转型:

TEST <- matrix(
       c(15366,2079,411,366,23223,2667,699,819, 
       31632,2724,717,1473,49938,3111,1062,11964), 
       nrow=4,ncol=4,byrow=T) 

> TEST/(sqrt(rowSums(TEST)) %o% colSums(TEST)) 
      [,1]  [,2]  [,3]   [,4] 
[1,] 0.0009473414 0.001455559 0.001053892 0.0001854284 
[2,] 0.0011674098 0.001522501 0.001461474 0.0003383284 
[3,] 0.0013770523 0.001346668 0.001298230 0.0005269580 
[4,] 0.0016167998 0.001143812 0.001430074 0.0031831055 

在大致相同的方式,你可以计算出该行转型。

做的手工计算,我可以证实,我的解决方案是正确的,只要我理解正确的索引符号(意思是i代表行j列的)。你期望的数字不是你所说的那些。为了向你展示:

> (TEST[1,2]/sum(TEST[,2]))/sqrt(sum(TEST[1,])) 
[1] 0.001455559 

卡方归你说说,实际上可以在函数中vegandecostand被发现。请注意,默认情况下,该方法通过乘以矩阵总和的平方根来进行调整。这在对应分析中是有意义的。

如果你不想使用此修正,那么你可以得到如柱改造也如下:

> require(vegan) 
> decostand(TEST,method="chi.square",MARGIN=2)/sqrt(sum(TEST)) 
      [,1]   [,2]  [,3]  [,4] 
[1,] 0.0009473414 0.0011674098 0.001377052 0.001616800 
[2,] 0.0014555588 0.0015225011 0.001346668 0.001143812 
[3,] 0.0010538924 0.0014614736 0.001298230 0.001430074 
[4,] 0.0001854284 0.0003383284 0.000526958 0.003183106 
attr(,"decostand") 
[1] "chi.square" 
+0

我知道这是家庭作业,但我想我们很好地通过了作业的截止日期,因此添加了一个实际上类似于R的解决方案 –