【问题标题】:Why are the column names of a dataframe getting changed automatically?为什么数据框的列名会自动更改?
【发布时间】:2022-01-14 12:42:55
【问题描述】:

我想估计R 中线性回归模型的参数。模型的类型为:y=(alpha)+(beta*x)+epsilon。该任务要求我将参数值系统地放置在数据框中。因此,我创建了一个空白数据框,然后继续在其中添加参数值的行。

df<-data.frame(alpha=double(),beta=double()) #blank dataframe
for(i in 1:1000)
{
    sample_dat<-sampling_model(100,2,5,16,-2,2) #generating 100 samples
    sample_model<-lm(y~x,data=sample_dat) #estimating the linear model
    df<-rbind(df,sample_model$coefficients) #appending the values of the parameters
}

基本上,我有一个函数sampling_model,它被设计成可以为x_iepsilon_i 生成随机值(两者都遵循某种分布)并给出y_i 的值s 将这两个加上一些固定的 alpha 和 beta 值。

在上述循环的每次迭代中,我们在将线性模型拟合到参数(alpha 和 beta)时得到一对估计值。我想将它们存储在一个数据框中,我将其命名为df

最初(在开始循环之前),names(df) 返回:

#[1] "alpha" "beta"

但是,在将所有这些 alpha 和 beta 估计值附加到 df(即循环之后)之后,names(df) 返回:

#[1] "X2.4932268478702"  "X5.53432974825338"

我被困在这里,问自己为什么会这样。最好注意这些名称也不是恒定的。就像,如果我再次运行上述循环然后检查列的名称,数字都是不同的。是溢出了还是我在将值附加到数据框时犯了一些错误?

另外,我可以(并且确实)通过以下方式解决这个“模糊”名称的问题:

names(df)<-c('alpha','beta')

但这并不能掩盖我在df 中附加估计参数时出错的事实,我无法弄清楚这一点。任何人都可以帮助我如何避免这种情况?


为了方便,我还附上了我的sampling_model 函数:

sampling_model<-function(n,alpha,beta,variance,min_range,max_range)
{
    x<-runif(n,min=min_range,max=max_range) #n uniform variates as x_i
    epsilon<-rnorm(n,mean=0,sd=sqrt(variance)) #n normal variates as epsilon_i
    y<-alpha+beta*x+epsilon #the dependant variable y
    return(data.frame(x=x,y=y)) #returns dataframe of x and y
}

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我不确定为什么会发生这种情况,它的奇怪行为似乎只在第一个 rbind 参数没有行时才会发生。但是rbinding 数据帧一起循环是一种非常低效的坏习惯,应该避免。它是著名的 R 地狱第二圈The R Inferno

    最简单的替代方法是将数据初始化为完整大小,然后填写每一行:

    n <- 1000
    df <- data.frame(alpha=double(n),beta=double(n)) #blank dataframe
    for(i in 1:n)
    {
        sample_dat <- sampling_model(100,2,5,16,-2,2) #generating 100 samples
        sample_model <- lm(y~x,data=sample_dat) #estimating the linear model
        df[i, ] <- sample_model$coefficients #filling in the values of the parameters
    }
    

    【讨论】:

    • 好吧,现在我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 2020-07-02
    • 2011-08-30
    相关资源
    最近更新 更多