我需要有关如何按列进行多元回归的指南。 我有一个数据框,我想让每个列分别拟合系数。到目前为止,我只能在一列中获得这些结果。
到目前为止我尝试了什么
可能将结果分配给新变量
(model.out1< - lm(y1~x1)) (model.out2< - lm(y2~x2))
可能会有效,但我不想写几个拟合方程,每次都要说15个和列名。这不是优雅的解决方案。
2. using `apply` function
aa <- apply(df[4:8],2,fit_function)
fit_function <- function(x){nlsLM(x~ifelse(df$direc=="North"&V<J1, exp((-t_pw)/f0*exp(-del1*(1-V/J1)^2)),1)*ifelse(df$direc=="South"&V>J2, exp((-t_pw)/f0*exp(-del2*(1-V/J2)^2)),1)
,data=df,start=c(del1=5,J1=15,del2=1,J2=-5),trace=T)}
通常我们知道错误
nlsModel中的错误(formula,mf,start,wts):奇异渐变 初始参数估计矩阵
可能将这些列分开并适合它们中的每一个并组合拟合系数可能有效。但我不知道该怎么做。
这里是您可检查有效性的可重复数据 的 DF
direc <- rep(rep(c("North","South"),each=10),times=6)
V <- rep(c(seq(2,40,length.out=10),seq(-2,-40,length.out=10)),times=1)
DQ0 = c(replicate(2, sort(runif(10,0.001,1))))
DQ1 = c(replicate(2, sort(runif(10,0.001,1))))
DQ2 = c(replicate(2, sort(runif(10,0.001,1))))
DQ3 = c(replicate(2, sort(runif(10,0.001,1))))
DQ4 = c(replicate(2, sort(runif(10,0.001,1))))
group = c(replicate(1,rep(letters[1:6],each=20)))
df <- data.frame(group,direc,V,DQ0,DQ1,DQ2,DQ3,DQ4)
library(minpack.pl)
因为我想对所有列DQ0,DQ1,DQ2,DQ3,DQ4进行拟合,所以我写下了这个函数。
拟合功能
f0<-1e-9
t_pw<-3e-8
nls_fit=nlsLM(DQ0~ifelse(df$direc=="North"&V<J1, exp((-t_pw)/f0*exp(-del1*(1-V/J1)^2)),1)*ifelse(df$direc=="South"&V>J2, exp((-t_pw)/f0*exp(-del2*(1-V/J2)^2)),1)
,data=df,start=c(del1=5,J1=15,del2=1,J2=-5),trace=T)
并在每个组内获得拟合结果。
df_new<- df%>%
group_by(group)%>%
do(data.frame(model=tidy(nls_fit)))%>%
select_("delta"="model.term","value"= "model.estimate")
如何将DQ1,DQ2,DQ3和DQ4的拟合结果作为表格。也许这样的事情更可取
group delta value_DQ0 value_DQ1 value_DQ2 value_DQ3 value_DQ4
1 a del1 4.962564 * * * *
2 a J1 14.666667 * * * *
3 a del2 3.496986 * * * *
4 a J2 -14.468551
5 b del1 4.962564
6 b J1 14.666667
7 b del2 3.496986
8 b J2 -14.468551
9 c del1 4.962564
10 c J1 14.666667
.. ... ... ...
修改 我找到了Help with lm and multiple linear regression 也许我可以通过这个来做到这一点
dat <- data.frame(x=1:10,y=rnorm(10),z=10:1)
lm(x~., data=dat)
但是当我像上面那样用DQ0替换if else时我得到了这个错误
可能我错过了一些部分。你能给出一个明确的答案吗?我们将不胜感激。