R создает другой результат после ввода IO в файл

58
8

Как новый для 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")

(источник), он печатает "критерий Калиньски оптимального числа кластеров: 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 печатает "критерий Калински оптимальное количество кластеров: 1".

Я думаю, что формат (или что-то еще) был изменен после IO из файла в R. Но я не знаю, как R читает и записывает числа. Может ли кто-нибудь дать мне несколько подсказок, спасибо.

EDIT Если файл написан без имени col и имени строки, проблема решена.


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

При чтении R также считывает имена строк и столбцов. Другой - избегать этих имен при чтении.

спросил(а) 2014-01-09T17:24:00+04:00 6 лет, 8 месяцев назад
1
Решение
98

Индекс 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, критерий ?cascadeKM определяется как (SSB/(K-1))/(SSW/(nK)) и для одной группы 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 (а не числом).

ответил(а) 2014-01-10T14:46:00+04:00 6 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема