You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用predict.lm()时预测值等于DV均值的技术求助

R语言predict.lm()基于自变量均值预测因变量时结果等于DV均值的问题

我在用predict.lm()函数,基于三个自变量的样本均值预测因变量时遇到了问题——预测结果始终等于因变量的均值,不管是直接用函数预测,还是手动用回归系数计算,结果都是一样的。

变量说明

因变量(DV):

  • Pre_TimeinSB_Troiano2008_100cpm_30min_plusBouts_pd:每日持续静坐至少30分钟的时长(分钟/天)

自变量(IV):

  • Pre_Time_Copeland2009_ST_25cpm_pd:加速度计佩戴时长(分钟/天)
  • Pre_SED_Troiano2008_pd:每日总静坐时长(分钟/天)
  • Pre_TotalMVPA_Copeland2009_ST_25cpm_pd:每日中高强度体力活动总时长(分钟/天)

环境信息

  • R Studio版本:2022.12.0+353
  • R版本:4.2.2
  • 平台:aarch64-apple-darwin20(64位)
  • 运行环境:macOS Monterey 12.6.2
  • 已加载包:base包、tidyverse、modeldata等

运行代码

library(tidyverse)
library(modeldata)

setwd("/Users/Datasets/Manuscript")
d<-read.csv('PREDICTORS.csv',sep=',',header = T)

mean_time=mean(d$Pre_Time_Copeland2009_ST_25cpm_pd)
mean_sed_tr=mean(d$Pre_SED_Troiano2008_pd)
mean_mvpa_cop=mean(d$Pre_TotalMVPA_Copeland2009_ST_25cpm_pd)
mean_mvpa_tr=mean(d$Pre_TotalMVPA_Troiano2008_pd)
mean_tsb30min=mean(d$Pre_TimeinSB_Troiano2008_100cpm_30min_plusBouts_pd)

modstate3 <- reformulate(c("Pre_Time_Copeland2009_ST_25cpm_pd",    
"Pre_SED_Troiano2008_pd","Pre_TotalMVPA_Copeland2009_ST_25cpm_pd"),
response="Pre_TimeinSB_Troiano2008_100cpm_30min_plusBouts_pd")
reg3 = lm(modstate3, d)
r3 = resid(reg3)
new3 <- data.frame(Pre_Time_Copeland2009_ST_25cpm_pd=c(mean_time), 
Pre_SED_Troiano2008_pd=c(mean_sed_tr),      
Pre_TotalMVPA_Copeland2009_ST_25cpm_pd=c(mean_mvpa_cop))
p3=predict.lm(reg3, newdata=new3)
p3a <- as.numeric(p3)
print(p3a)
reg3$coefficients

输出结果

print(p3a)
#> [1] 202.596
format(p3a, digits = 10)
#> [1] "202.5960184"
reg3$coefficients
(Intercept)             Pre_Time_Copeland2009_ST_25cpm_pd 
103.0348261                -0.9109195 
Pre_SED_Troiano2008_pd      Pre_TotalMVPA_Copeland2009_ST_25cpm_pd 
1.3963774                        1.4143874 
print(mean_time)
[1] 867.0451
print(mean_sed_tr)
[1] 587.5502
print(mean_mvpa_cop)
[1] 48.73319
print(mean_tsb30min)
[1] 202.596
y3 = 103.0348261 + (-0.9109195*867.0451) + (1.3963774*587.5502) + (1.4143874*48.73319)
print(y3)
[1] 202.596
format(y3, digits = 10)
[1] "202.5959677"

已尝试的解决方法

  • 使用predict(reg3, newdata=new3)替代predict.lm()
  • 直接写出回归模型公式(而非用reformulate)
  • 创建包含119个(样本量)自变量均值的向量作为newdata
  • 构建仅含佩戴时长单个自变量的简单回归模型

其中前3种方法结果和原问题一致,第4种方法无效。

恳请各位提供解决思路,谢谢!

内容的提问来源于stack exchange,提问作者dmp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:14:54