在文件上IO后,R产生不同的结果

时间:2014-01-09 14:24:28

标签: r

作为R的新手,我对写入和阅读矢量数据有疑问。

我的例子1

n = 100
g = 6
set.seed(g)
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), 
                y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))))
plot(d)
require(vegan)
fit <- cascadeKM(scale(d, center = TRUE,  scale = TRUE), 1, 10, iter = 1000)
plot(fit, sortg = TRUE, grpmts.plot = TRUE)
calinski.best <- as.numeric(which.max(fit$results[2,]))
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")

source),按预期打印“Calinski准则最佳聚类数:5”。

示例2 :(首先写入数据帧d,然后读取它)

n = 100
g = 6 
set.seed(g)
d <- data.frame(x = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))), 
                y = unlist(lapply(1:g, function(i) rnorm(n/g, runif(1)*i^2))))

write.table(d, "d.txt", sep='\t', quote=FALSE) #write data frame
d = read.table("d.txt", header=TRUE, sep = '\t') #read later
plot(d)

require(vegan)
fit <- cascadeKM(scale(d, center = TRUE,  scale = TRUE), 1, 10, iter = 1000)
plot(fit, sortg = TRUE, grpmts.plot = TRUE)
calinski.best <- as.numeric(which.max(fit$results[2,]))
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")

然而,示例2打印“Calinski准则最佳簇数:1”。

我认为格式(或其他)在来自R中的文件IO后已经改变了。但我不知道R如何读写数字。任何人都可以给我一些线索,谢谢。

EDIT 如果文件没有列名和行名,则问题解决了。

write.table(d, "d.txt", sep='\t', quote=FALSE, row.name=FALSE, col.names=FALSE)

阅读时,R还会读取行和列名称。 另一个是在阅读时逃避这些名字。

1 个答案:

答案 0 :(得分:0)

无法为一个组计算Calinski指数,但它变为Inf或-Inf。在第一个例子中它碰巧是-Inf,而在第二个例子中它碰巧是Inf,当你寻找which.max时,Inf就是你得到的。我不知道为什么我们真的费心去计算一类案例的索引,但是如果你搜索最好的结果,你应该忽略第一种情况。我们在plot命令中这样做,在两种情况下都给出了五个簇作为最佳结果。在以下两种情况下,代码的以下修改将给出相同的答案:

calinski.best <- as.numeric(which.max(fit$results[2,-1])) + 1
cat("Calinski criterion optimal number of clusters:", calinski.best, "\n")

我们必须有+1,因为我们省略了一列。

Inf / -Inf不确定性的小细节。正如您在?cascadeKM中所见,Calinski准则定义为(SSB /(K-1))/(SSW /(n-K)),对于一组K = 1,因此SSB / 0 = Inf。对于一组也SSB = 0,但计算为零,这些在数字计算机中很少精确,在我的计算机中零为-2.8e-14和-2.8e-14/0 = -Inf。在第二个例子中,SSB = 2.8e-14和2.8e-14/0 = Inf。当您寻找最佳时,只需忽略第一列。偶尔SSB可以精确为零,然后0/0 = NaN(不是数字)。