提问人:Shawn Hemelstrand 提问时间:10/31/2023 更新时间:10/31/2023 访问量:22
自定义预测函数不会返回 R 中的均值控制变量
Custom prediction function doesn't give back mean-controlled variables in R
问:
我正在尝试创建一个快速函数,用于从回归生成预测数据,该函数还控制其他预测变量的均值,但我在代码的第二次迭代中陷入了死胡同。第一个版本运行良好。下面是它的样子。
#### 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
如何解决此问题?
答:
下一个:使用 NA 填充只有零的组
评论
print(n = 200, gen.line(fit = fit, x = x, name = "x", extra_vars = list(z = z)))