lm用于预测R中因变量的值

时间:2018-01-26 18:31:20

标签: r apply lm

我有一个随机数量的定量变量的数据框。我需要编写一个函数来计算lm来预测因变量的值。作为预测变量,我想只使用那些具有p.value>的变量。 0.05。该函数应返回仅为所选预测变量构造的线性回归系数作为向量。如果数据中没有这样的预测变量,则该函数应返回警告“数据中没有正常变量”。我写了这个函数,但它不起作用。

smart_lm <-  function(x) {
  sl <- apply(x[2:dim(x)[2]], 2, function(x) shapiro.test(x)$p.value)
  my_reg <- lm(as.formula(paste("x[[1]]~",paste(x[2:dim(x)[2]], collapse = "+"))))
  return(ifelse(sl[sl > 0.05], my_reg, "There are no normal variables in the data"))
}

1 个答案:

答案 0 :(得分:0)

如果我理解正确,以下情况应该这样做 请注意,不需要ifelse,并且公式使用点.来包含尚未包含在公式中的数据参数的所有变量,这些变量都是DF2[[1]]

set.seed(1665)    # Make the results reproducible
n <- 100
x1 <- rnorm(n)
x2 <- rnorm(n, 2, 6)
x3 <- rexp(n)
y <- x1 + x2 + x3 + rnorm(n)

dat <- data.frame(y, x1, x2, x3)

smart_lm <- function(DF){
    sl <- c(NA, sapply(DF[-1], function(x) shapiro.test(x)$p.value))
    DF2 <- DF[, which(sl > 0.05)]
    names(DF2) <- names(DF)[which(sl > 0.05)]
    lm(DF2[[1]] ~ ., data = DF2)
}

smart_lm(dat)
#
#Call:
#lm(formula = DF2[[1]] ~ ., data = DF2)
#
#Coefficients:
#(Intercept)           x1           x2  
# -3.331e-17    1.000e+00    9.593e-18