Как вы находите размеры выборки, используемые в расчетах по r?
Я использую корреляции между переменными, некоторые из которых содержат недостающие данные, поэтому размер выборки для каждой корреляции, вероятно, различен. Я пробовал печатать и резюмировать, но ни один из них не показывает, насколько велик мой n для каждой корреляции Это довольно простая проблема, и я нигде не могу найти ответ.
4 ответа
Как это..?
x <- c(1:100,NA)
length(x)
length(x[!is.na(x)])
Вы также можете получить степени свободы, как это...
y <- c(1:100,NA)
x <- c(1:100,NA)
cor.test(x,y)$parameter
Но я думаю, что было бы лучше, если бы вы показали код, по которому вы оцениваете корреляцию для точной помощи.
Вот пример того, как найти попарные размеры выборки среди столбцов матрицы. Если вы хотите применить его к (определенным) числовым столбцам фрейма данных, объедините их соответствующим образом, приведите полученный объект к матрице и примените функцию.
# Example matrix:
xx <- rnorm(3000)
# Generate some NAs
vv <- sample(3000, 200)
xx[vv] <- NA
# reshape to a matrix
dd <- matrix(xx, ncol = 3)
# find the number of NAs per column
apply(dd, 2, function(x) sum(is.na(x)))
# tack on some column names
colnames(dd) <- paste0("x", seq(3))
# Function to find the number of pairwise complete observations
# among all pairs of columns in a matrix. It returns a data frame
# whose first two columns comprise all column pairs
pairwiseN <- function(mat)
{
u <- if(is.null(colnames(mat))) paste0("x", seq_len(ncol(mat))) else colnames(mat)
h <- expand.grid(x = u, y = u)
f <- function(x, y)
sum(apply(mat[, c(x, y)], 1, function(z) !any(is.na(z))))
h$n <- mapply(f, h[, 1], h[, 2])
h
}
# Call it
pairwiseN(dd)
Функция может быть легко улучшена; например, вы можете установить h <- expand.grid(x = u[-1], y = u[-length(u)])
чтобы сократить количество вычислений, вы можете вернуть матрицу nxn вместо фрейма данных с тремя столбцами и т. д.
Вот реализация цикла for функции Денниса выше для вывода матрицы nxn вместо того, чтобы использовать pivot_wide() для этого результата. В моем кластере блоков данных это сократило время вычислений для матрицы 1865 строк x 69 столбцов с 2,5–3 минут до 30–40 секунд.
Спасибо за ваш ответ Денис, это помогло мне в моей работе.
pairwise_nxn <- function(mat)
{
cols <- if(is.null(colnames(mat))) paste0("x", seq_len(ncol(mat))) else colnames(mat)
nn <- data.frame(matrix(nrow = length(cols), ncol = length(cols)))
rownames(nn) <- colnames(nn) <- cols
f <- function(x, y)
sum(apply(mat[, c(x, y)], 1, function(z) !any(is.na(z))))
for (i in 1:nrow(nn))
for (j in 1:ncol(nn))
nn[i,j] <- f(rownames(nn)[i], colnames(nn)[j])
nn
}
Если ваши переменные являются векторами с именем a
а также b
, было бы что-то вроде sum(is.na(a) | is.na(b))
помочь тебе?