自定义预测函数不会返回 R 中的均值控制变量

问题描述 投票:0回答:1

我正在尝试创建一个快速函数,用于从回归生成预测数据,该函数还控制其他预测变量的平均值,但我在代码的第二次迭代中遇到了死胡同。第一个版本运行完美。下面是它的样子。

#### Line Data Function ####
gen.line <- function(fit,x,name,l=200){
  
  #### Load DPLYR ####
  suppressPackageStartupMessages(require(dplyr))
  
  #### Generate X Data ####
  df <- data.frame(
    x = seq(
      min(x),
      max(x),
      length.out=l
    )
  ) %>% 
    setNames(name) %>%
    as_tibble()
  
  #### Predict Y ####
  p <- predict(fit,newdata=df)
  
  #### Create line.data tibble ####
  line.data <- tibble(
    !!name := df[[name]], # this prevents $ operator
    y = p
  )
  
  #### Return Seq and Pred Data ####
  return(line.data)
}

#### Get Data ####
set.seed(123)
x <- runif(100,0,8) + 50
y <- 50 + cos(x) + rnorm(100,sd=.5) 
fit <- lm(y ~ cos(x))

#### Generate Line ####
plot(x,y)
lines <- gen.line(
  fit,
  x,
  "x"
)

这给了我正确的预测线:

问题是当我尝试将其概括为包括设置为平均值以产生部分效应图的任何其他预测变量时。到目前为止我的代码如下所示:

#### Mean-Controlled Version ####
gen.line <- function(fit, # regression
                     x, # variable of interest
                     name, # name of variable
                     l=200, # length of xseq
                     extra_vars=list()){ # other vars
  #### Load DPLYR ####
  suppressPackageStartupMessages(require(dplyr))
  
  #### Generate X Data ####
  df <- data.frame(
    x = seq(
      min(x),
      max(x),
      length.out=l
    )
  ) %>% 
    setNames(name) %>%
    as_tibble()
  
  #### Add extra variables ####
  for(var in names(extra_vars)) {
    df <- df %>% 
      mutate(!!var := mean(extra_vars[[var]]))
  }
  
  #### Predict Y ####
  p <- predict(fit,newdata=df)
  
  #### Create line.data tibble ####
  line.data <- tibble(
    !!name := df[[name]],
    y = p
  )
  
  #### Return Seq and Pred Data ####
  return(line.data)
}


#### Get Data ####
set.seed(123)
x <- runif(100,0,8) + 50
z <- runif(100,0,8) + 30
y <- 50 + cos(x) + cos(z) + rnorm(100,sd=.5) 

#### Fit Data ####
fit <- lm(y ~ cos(x) + cos(z))
summary(fit)

#### Generate Line ####
gen.line(
  fit, x, "x", extra_vars = list(z = z)
)

当我运行最后一行代码时,它给了我一个恒定的

y
值,这显然是错误的(它是预测数据,因此它应该根据
x
值进行更改。请参见下面的输出。

# A tibble: 200 × 2
       x     y
   <dbl> <dbl>
 1  50.0  50.0
 2  50.0  50.0
 3  50.1  50.0
 4  50.1  50.0
 5  50.2  50.0
 6  50.2  50.0
 7  50.2  50.0
 8  50.3  50.0
 9  50.3  50.0
10  50.4  50.0
# ℹ 190 more rows
# ℹ Use `print(n = ...)` to see more rows

如何解决这个问题?

r function regression scatter-plot predict
1个回答
0
投票

正如贾里德指出的,问题很简单,就是我没有足够好地检查数据。直接绘制代码显示均值控制的部分效应图线仍然显示。

plot(x,y)
lines(lines)

© www.soinside.com 2019 - 2024. All rights reserved.