标签: lm

lm从dlply内部调用抛出"0(非NA)情况"错误[r]

我正在使用dlply()与自定义函数平均lm()的斜率适合包含一些NA值的数据,我得到错误"错误在lm.fit(x,y,偏移=偏移,singular.ok = singular.ok,...):0(非NA)案例"

这个错误只发生在我用两个关键变量调用dlply时 - 用一个变量分隔工作正常.

令人讨厌的是我无法使用简单的数据集重现错误,所以我在问题数据集中发布了问题数据集.

这是代码,尽可能最小化,同时仍然产生错误:

masterData <- read.csv("http://dl.dropbox.com/u/48901983/SOquestionData.csv", na.strings="#N/A")

workingData <- data.frame(sample = masterData$sample,
                      substrate = masterData$substrate,
                      el1 = masterData$elapsedHr1,
                      F1 = masterData$r1 - masterData$rK)

#This function is trivial as written; in reality it takes the average of many slopes
meanSlope <- function(df) {
     lm1 <- lm(df$F1 ~ df$el1, na.action=na.omit) #changing to na.exclude doesn't help
     slope1 <- lm1$coefficients[2]
     meanSlope <- mean(c(slope1)) 
}

lsGOOD <- dlply(workingData, .(sample), meanSlope) #works fine

lsBAD <- dlply(workingData, .(sample, substrate), meanSlope) #throws error …
Run Code Online (Sandbox Code Playgroud)

r plyr lm

8
推荐指数
1
解决办法
7953
查看次数

是否有一个函数或包来模拟从lm()返回的对象的预测?

是否有单一的功能,类似于"runif","rnorm"等,它们将为线性模型产生模拟预测?我可以自己编写代码,但代码很难看,我认为这是以前有人做过的事情.

slope = 1.5
intercept = 0
x = as.numeric(1:10)
e = rnorm(10, mean=0, sd = 1)
y = slope * x + intercept + e
fit = lm(y ~ x, data = df)
newX = data.frame(x = as.numeric(11:15))
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是一个看起来如下所示的函数:

sims = rlm(1000, fit, newX)
Run Code Online (Sandbox Code Playgroud)

该函数将根据新的x变量返回1000个y值模拟.

regression r lm

8
推荐指数
1
解决办法
2166
查看次数

update()具有局部协变量的函数内的模型

我需要从函数内部更新回归模型.理想情况下,该功能应该与任何类型的模型(工作lm,glm,multinom,clm).更准确地说,我需要添加一个或几个在函数内定义的协变量.这是一个例子.

MyUpdate <- function(model){
     randData <- data.frame(var1=rnorm(length(model$residuals)))
     model2 <- update(model, ".~.+randData$var1")
     return(model2)
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例用法

data(iris)
model1 <- lm(Sepal.Length~Species, data=iris)
model2 <- MyUpdate(model1)
Run Code Online (Sandbox Code Playgroud)

eval(expr,envir,enclos)出错:找不到对象'randData'

这是glm的另一个例子

model1 <- glm(Sepal.Length>5~Species, data=iris, family=binomial)
model2 <- MyUpdate(model1)
Run Code Online (Sandbox Code Playgroud)

任何的想法?

r lm glm

8
推荐指数
1
解决办法
715
查看次数

R - 强制某个参数在lm()中具有正系数

我想知道如何约束某些参数lm()以获得正系数.有一些包或函数(例如display)可以使所有系数和拦截为正.

例如,在这个例子中,我只想强迫x1x2具有正系数.

    x1=c(NA,rnorm(99)*10)
    x2=c(NA,NA,rnorm(98)*10)
    x3=rnorm(100)*10
    y=sin(x1)+cos(x2)-x3+rnorm(100)

    lm(y~x1+x2+x3)

    Call:
      lm(formula = y ~ x1 + x2 + x3)       
    Coefficients:
      (Intercept)           x1           x2           x3  
    -0.06278      0.02261     -0.02233     -0.99626
Run Code Online (Sandbox Code Playgroud)

我试过功能nnnpls()nnls,它可以轻松控制系数符号.遗憾的是,由于数据中的NA问题,我无法使用它,因为此函数不允许NA.

我看到函数NA可用于应用约束但我无法使其工作.

有人能让我知道我该怎么办?

regression r linear-regression lm glm

8
推荐指数
1
解决办法
6899
查看次数

R中的lm函数不给出分类数据中所有因子水平的系数

我正在尝试使用分类属性对R进行线性回归,并观察到我没有得到每个不同因子水平的系数值.

请参阅下面的代码,我有状态的5个因子级别,但只能看到4个系数值.

> states = c("WA","TE","GE","LA","SF")
> population = c(0.5,0.2,0.6,0.7,0.9)
> df = data.frame(states,population)
> df
  states population
1     WA   0.5
2     TE   0.2
3     GE   0.6
4     LA   0.7
5     SF   0.9
> states=NULL
> population=NULL
> lm(formula=population~states,data=df)

Call:
lm(formula = population ~ states, data = df)

Coefficients:
(Intercept)     statesLA     statesSF     statesTE     statesWA  
        0.6          0.1          0.3         -0.4         -0.1
Run Code Online (Sandbox Code Playgroud)

我还通过执行以下操作尝试使用更大的数据集,但仍然看到相同的行为

for(i in 1:10)
{
    df = rbind(df,df)
}
Run Code Online (Sandbox Code Playgroud)

编辑:感谢eipi10,MrFlick和经济的回应.我现在明白其中一个级别被用作参考级别.但是当我得到一个状态值为"GE"的新测试数据时,如何用等式y = m1x1 + m2x2 + ... + c代替?

我也尝试将数据展平,使得每个因子级别都得到它的单独列,但是对于其中一个列,我得到NA作为系数.如果我有一个状态为'WA'的新测试数据,我怎样才能获得'人口价值'?我用什么代替它的系数?

> df1 …
Run Code Online (Sandbox Code Playgroud)

r linear-regression lm

8
推荐指数
1
解决办法
1万
查看次数

使用lm()的线性回归 - 结果令人惊讶

我使用函数对我拥有的数据进行了线性回归lm.一切正常(没有错误信息),但我对结果感到惊讶:我的印象是R"错过"一组积分,即截距和斜率不是最合适的.例如,我指的是坐标x = 15-25,y = 0-20处的点群.

我的问题:

  • 是否有一个函数来比较拟合与"预期"系数和"lm计算"系数?
  • 编码时我犯了一个愚蠢的错误,导致lm这样做吗?

以下是一些答案:x和y的附加信息

x和y都是疾病症状的视觉估计.两者都存在同样的不确定性. 数据图,具有线性回归和预期结果的预测

数据和代码在这里:

x1=c(24.0,23.9,23.6,21.6,21.0,20.8,22.4,22.6,
     21.6,21.2,19.0,19.4,21.1,21.5,21.5,20.1,20.1,
     20.1,17.2,18.6,21.5,18.2,23.2,20.4,19.2,22.4,
     18.8,17.9,19.1,17.9,19.6,18.1,17.6,17.4,17.5,
     17.5,25.2,24.4,25.6,24.3,24.6,24.3,29.4,29.4,
     29.1,28.5,27.2,27.9,31.5,31.5,31.5,27.8,31.2,
     27.4,28.8,27.9,27.6,26.9,28.0,28.0,33.0,32.0,
     34.2,34.0,32.6,30.8)

y1=c(100.0,95.5,93.5,100.0,98.5,99.5,34.8,
     45.8,47.5,17.4,42.6,63.0,6.9,12.1,30.5,
     10.5,14.3,41.1, 2.2,20.0,9.8,3.5,0.5,3.5,5.7,
     3.1,19.2,6.4, 1.2, 4.5, 5.7, 3.1,19.2, 6.4,
     1.2,4.5,81.5,70.5,91.5,75.0,59.5,73.3,66.5,
     47.0,60.5,47.5,33.0,62.5,87.0,86.0,77.0,
     86.0,83.0,78.5,83.0,83.5,73.0,69.5,82.5,78.5,
     84.0,93.5,83.5,96.5,96.0,97.5)   



## x11()
plot(x1,y1,xlim=c(0,35),ylim=c(0,100))

# linear regression
reg_lin=lm(y1 ~ x1)
abline(reg_lin,lty="solid", col="royalblue")
text(12.5,25,labels="R result",col="royalblue", cex=0.85)
text(12.5,20,labels=bquote(y== .(5.26)*x - .(76)),col="royalblue", cex=0.85)

# result I would have imagined
abline(a=-150,b=8,lty="dashed", col="red")
text(27.5,25,labels="What I think is better",col="red", cex=0.85)
text(27.5,20,labels=bquote(y== .(8)*x - .(150)),col="red", cex=0.85)
Run Code Online (Sandbox Code Playgroud)

r orthogonal linear-regression least-squares lm

8
推荐指数
2
解决办法
1118
查看次数

在lm lapply调用列表中使用权重参数

这是我的问题(虚构数据,以便可重现):

set.seed(42)
df<-data.frame("x"=rnorm(1000),"y"=rnorm(1000),"z"=rnorm(1000))
df2<-data.frame("x"=rnorm(100),"y"=rnorm(100),"z"=rnorm(100))
breaks<-c(-1000,-0.68,-0.01315,0.664,1000)
divider<-cut(df$x,breaks)
divider2<-cut(df2$x,breaks)
subDF<-by(df,INDICES=divider,data.frame)
subDF2<-by(df2,INDICES=divider2,data.frame)
reg<-lapply(subDF,lm,formula=x~.)
pre<-lapply(1:4,function(x){predict(reg[[x]],subDF2[[x]])})
lapply(1:4,function(x){summary(reg[[x]])$r.squared})
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常.我正在做的是:根据值x,我分成df4个数据帧并对每个数据帧进行回归,以便能够预测其他数据集的值.数据帧的分割是为了更好地预测,因为范围对x实际数据有很大影响.

我想要做的是为回归添加权重参数,以更加重视最新数据.我的权重参数是:weights<-0.999^seq(250,1,by=-1)如果有250个数据.种子为42,之前的断裂,所有4个维度都是250.

当我尝试做的时候reg<-lapply(subDF,lm,formula=x~.,weights=0.999^seq(250,1,by=-1)),我收到了这个错误:

Error in eval(expr, envir, enclos) : 
  ..2 used in an incorrect context, no ... to look in
Run Code Online (Sandbox Code Playgroud)

这是一个很奇怪,因为lapply有一个...参数,在这里使用formula但它不接受weights.

所以我真的不知道如何添加这些权重.我应该在我的代码中纠正什么,或者我(几乎)完全改变它以便能够使用权重?

对于该示例并且为了使它(可能)更容易,我剪切了断点以使4个子集具有相同的维度,但理想情况下,即使4个子集不具有相同的维度,所以答案也将起作用(因此,breaks<-c(-1000,-0.75,0,0.75,1000)对于实例)

CrossValidated上的这篇文章有着相同的问题,但没有一个有效的解决方案,所以这对我没有帮助.

r lapply lm

8
推荐指数
2
解决办法
194
查看次数

沿线性回归线绘制条件密度曲线"P(Y | X)"

这是我的数据框,有两列Y(响应)和X(协变量):

## Editor edit: use `dat` not `data`
dat <- structure(list(Y = c(NA, -1.793, -0.642, 1.189, -0.823, -1.715, 
    1.623, 0.964, 0.395, -3.736, -0.47, 2.366, 0.634, -0.701, -1.692, 
    0.155, 2.502, -2.292, 1.967, -2.326, -1.476, 1.464, 1.45, -0.797, 
    1.27, 2.515, -0.765, 0.261, 0.423, 1.698, -2.734, 0.743, -2.39, 
    0.365, 2.981, -1.185, -0.57, 2.638, -1.046, 1.931, 4.583, -1.276, 
    1.075, 2.893, -1.602, 1.801, 2.405, -5.236, 2.214, 1.295, 1.438, 
    -0.638, 0.716, 1.004, -1.328, -1.759, -1.315, 1.053, 1.958, -2.034, 
    2.936, -0.078, -0.676, -2.312, …
Run Code Online (Sandbox Code Playgroud)

plot regression r linear-regression lm

8
推荐指数
1
解决办法
412
查看次数

在不同变量上运行 lm 的函数

我想创建一个函数,该函数可以在给定数据集中的不同变量上运行回归模型(例如使用 lm)。在这个函数中,我将指定我正在使用的数据集、因变量 y 和自变量 x 作为参数。我希望这是一个函数而不是循环,因为我想在脚本的各个地方调用代码。我的天真函数看起来像这样:

lmfun <- function(data, y, x) {
  lm(y ~ x, data = data)
}
Run Code Online (Sandbox Code Playgroud)

该函数显然不起作用,因为 lm 函数无法将 y 和 x 识别为数据集的变量。

我做了一些研究并偶然发现了以下有用的小插图:使用 dplyr 编程。小插图为我面临的类似问题提供了以下解决方案:

df <- tibble(
  g1 = c(1, 1, 2, 2, 2),
  g2 = c(1, 2, 1, 2, 1),
  a = sample(5),
  b = sample(5)
)

my_sum <- function(df, group_var) {
  group_var <- enquo(group_var)
  df %>%
    group_by(!! group_var) %>%
    summarise(a = mean(a))
}
Run Code Online (Sandbox Code Playgroud)

我知道 lm 不是 dplyr 包中的一个函数,但想提出一个与此类似的解决方案。我尝试了以下方法:

lmfun <- function(data, …
Run Code Online (Sandbox Code Playgroud)

r lm quosure

8
推荐指数
1
解决办法
496
查看次数

线性回归并将结果存储在数据框中

我正在对数据框中的一些变量进行线性回归.我希望能够通过分类变量对线性回归进行子集化,对每个分类变量运行线性回归,然后将t-stats存储在数据框中.如果可能的话,我想在没有循环的情况下这样做.

这是我正在尝试做的一个示例:

  a<-  c("a","a","a","a","a",
         "b","b","b","b","b",
         "c","c","c","c","c")     
  b<-  c(0.1,0.2,0.3,0.2,0.3,
         0.1,0.2,0.3,0.2,0.3,
         0.1,0.2,0.3,0.2,0.3)
  c<-  c(0.2,0.1,0.3,0.2,0.4,
         0.2,0.5,0.2,0.1,0.2,
         0.4,0.2,0.4,0.6,0.8)
      cbind(a,b,c)
Run Code Online (Sandbox Code Playgroud)

我可以从运行以下线性回归开始,非常容易地拉出t统计量:

  summary(lm(b~c))$coefficients[2,3]
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够在列a为a,b或c时运行回归.我想将t-stats存储在一个如下所示的表中:

variable t-stat
a        0.9
b        2.4
c        1.1
Run Code Online (Sandbox Code Playgroud)

希望有道理.如果您有任何建议,请告诉我!

r linear-regression lm

7
推荐指数
3
解决办法
2万
查看次数

标签 统计

lm ×10

r ×10

linear-regression ×5

regression ×3

glm ×2

lapply ×1

least-squares ×1

orthogonal ×1

plot ×1

plyr ×1

quosure ×1