我正在计算数据帧中多对列的r平方。我可以通过单独写出每对的代码来实现这一点,但我想使用apply或其他一些基于我从数据框中选择的列模式的矢量化方法来自动执行此操作。
示例数据:
set.seed(1234)
dat <- data.frame(replicate(18,rnorm(10)))
获得第1列v.2的r平方:
fit <- lm(dat[,1] ~ dat[,2])
summary(fit)$r.squared
但我想做以下所有组合:{1,2},{2,3},{3,1},{4,5},{5,6},{6,4} ......等到第18栏。
换句话说,三个窗口的所有组合每次都会移动到下一个三个窗口。这样我就可以在整个数据帧上调用一次函数,一次得到所有的r平方值,而不是重复18次代码。
答案 0 :(得分:3)
或者在一行中:
results <- sapply(1:ncol(dat), function(x) summary( lm( dat[ , x ] ~ dat[ ,ifelse( x%%3 != 0, x+1, x-2)]) )$r.squared )
答案 1 :(得分:1)
你可以试试这个:
v1 <- c(1:ncol(dat))
v2 <- v1 + c(1L, 1L, -2L)
m <- cbind(v1,v2)
fit <- lapply(1:length(dat),function(x) lm(dat[,m[x,1]]~dat[,m[x,2]]))
rsq <- sapply(1:length(dat), function(x) summary(fit[[x]])$r.squared)
答案 2 :(得分:0)
应该有效:
results <- apply(combn(colnames(dat), 2), 2, function(x)summary(lm(dat[, x[1]] ~ dat[, x[2]]))$r.squared)
答案 3 :(得分:0)
如果只需要r平方值,可以使用cor
函数给出相关矩阵。 r2只是该矩阵中值的平方。
答案 4 :(得分:0)
使用dplyr
包的替代流程:
set.seed(1234)
dat <- data.frame(replicate(18,rnorm(10)))
library(dplyr)
data.frame(colnames = names(dat)) %>% # get the names of columns
mutate(group = cumsum(ifelse(row_number() %in% seq(1,ncol(dat),3),1,0))) %>% # create group id based on 3 consecutive columns
group_by(group) %>% # for each group id
do({cb = combn(.$colnames,2) # create combinations of column names
data.frame(col1 = cb[1,],
col2 = cb[2,])}) %>%
mutate(formula = paste(col1,"~",col2)) %>% # create a formula for each combination
rowwise() %>% # for each row/formula
do(data.frame(formula = .$formula,
r.sq = summary(lm(.$formula, data=dat))$r.squared)) # create model and get r squared
# formula r.sq
# (chr) (dbl)
# 1 X1 ~ X2 3.072421e-02
# 2 X1 ~ X3 3.056746e-01
# 3 X2 ~ X3 7.708176e-02
# 4 X4 ~ X5 7.293980e-01
# 5 X4 ~ X6 3.244157e-01
# 6 X5 ~ X6 2.231886e-01
# 7 X7 ~ X8 6.637355e-03
# 8 X7 ~ X9 1.497414e-06
# 9 X8 ~ X9 9.758725e-02
# 10 X10 ~ X11 2.728225e-01
# 11 X10 ~ X12 5.973809e-02
# 12 X11 ~ X12 1.196112e-01
# 13 X13 ~ X14 5.541950e-02
# 14 X13 ~ X15 3.488573e-02
# 15 X14 ~ X15 2.519877e-02
# 16 X16 ~ X17 7.004510e-04
# 17 X16 ~ X18 8.827935e-02
# 18 X17 ~ X18 1.112862e-01
如果您愿意,可以替换mutate(group = cumsum(ifelse(row_number() %in% seq(1,ncol(dat),3),1,0)))
(基于3个连续列的窗口创建对)
mutate(group = ntile(row_number(),6))
(创建6组连续3列)。